Java+XSL合并多个XML文件
使用 Java 解析 XML 文件有许多成熟的工具,如 dom4j 等等。但在一些场景中,我们可能使用 Ant、Maven 等构建工具对多个 XML 文件进行合并,我们希望可以直接通过脚本文件,或者简单的程序就能完成这样的功能,那么使用 XSL 是一个非常不错的选择。本文将介绍通过简单的 Java 程序加上 XSL 文件来完成多个 XML 文件的合并操作。(XSL 是一种样式表语言,可用以描述如何显示一个 XML 文件)
背景:
- Config.xml 文件的结构与 FinalConfig.xml 文件相似;
- 需要将 Config.xml 文件的内容合并到 FinalConfig.xml 文件;
- 若 FinalConfig.xml 文件中已存在 Config.xml 的内容,则覆盖。
目标:程序执行完成后,生成一个唯一的 XML 文件 FinalConfig.xml;
FinalConfig.xml 文件结构:
<gameconfig>
<games>
<game>
<gameid>100</gameid>
<gamename>Fly to the Moon</gamename>
<gamedesc>This is Fly to the Moon</gamedesc>
</game>
<game>
<gameid>101</gameid>
<gamename>10 Miles</gamename>
<gamedesc>This is 10 Miles</gamedesc>
</game>
</games>
</gameconfig>
Config.xml 文件结构:
<gameconfig>
<games>
<game>
<gameid>100</gameid>
<gamename>Fly to the Sun</gamename>
<gamedesc>This is Fly to the Sun</gamedesc>
</game>
</games>
</gameconfig>
我们假定 gameid 是固定值,不会变。在合并完成后,<gameid>为 100 的 node 被更新。希望得到新的 FinalConfig.xml 文件如下:
<gameconfig>
<games>
<game>
<gameid>100</gameid>
<gamename>Fly to the Sun</gamename>
<gamedesc>This is Fly to the Sun</gamedesc>
</game>
<game>
<gameid>101</gameid>
<gamename>10 Miles</gamename>
<gamedesc>This is 10 Miles</gamedesc>
</game>
</games>
</gameconfig>
一、Java 调用程序
private void mergeXml(File xslFile, File configXml, File finalConfigXml){
DocumentBuilderFactory dbFac = DocumentBuilderFactory.newInstance();
DocumentBuilder builder;
Document destDoc = null;
FileInputStream input;
try{
builder = dbFac.newDocumentBuilder();
destDoc = builder.parse(finalConfigXml);
if(!finalConfigXml.exists())
{
finalConfigXml.createNewFile();
}
input = new FileInputStream(xslFile);
StreamSource source = new StreamSource(input);
Transformer transformer = TransformerFactory.newInstance().newTransformer(source);
//为xsl文件设置变量"configXmlPath",将configXml文件的路径传递给xsl
transformer.setParameter("configXmlPath", configXml.getPath());
transformer.transform(new DOMSource(destDoc), new StreamResult(finalConfigXml));
}catch(Exception e) {
e.printStackTrace();
}
}
二、XSL 文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes"/> <!-- pass the Config.xml file's path from Java code -->
<xsl:param name="configXmlPath"/>
<xsl:variable name="configXml" select="document($configXmlPath)"/> <xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template> <xsl:template match="/gamedata">
<xsl:copy>
<xsl:apply-templates select="games" mode="updateGames"/>
</xsl:copy>
</xsl:template> <xsl:template match ="games" mode="updateGames">
<xsl:variable name="gamesStr">
<xsl:for-each select="$configXml/gamedata/games/game">
<xsl:choose>
<xsl:when test="gameid">
<xsl:value-of select="concat('-',current()/gameid)"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
<games>
<xsl:for-each select="game">
<xsl:if test="not(contains($gamesStr,gameid))">
<xsl:copy-of select="current()"/>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates select="$configXml/gamedata/games/game" />
</games>
</xsl:template>
</xsl:stylesheet>
三、XSL 文件解析
1.Java 传入参数 “configXmlPath” 为 Config.xml 文件的路径
<xsl:param name="configXmlPath"/>
2.取出 Config.xml 文件中所有的 gameid,此处为增强处理,即 Config.xml 文件中可以存在多个 <game> 节点
<xsl:variable name="gamesStr">
<xsl:for-each select="$configXml/gamedata/games/game">
<xsl:choose>
<xsl:when test="gameid">
<xsl:value-of select="concat('-',current()/gameid)"/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:variable>
3.判断 FinalConfig.xml 的 <games> 子节点中是否存在当前的 gameid ,若不存在则复制
<xsl:for-each select="game">
<xsl:if test="not(contains($gamesStr,gameid))">
<xsl:copy-of select="current()"/>
</xsl:if>
</xsl:for-each>
4.复制 Config.xml 文件中的所有 <game> 节点
<xsl:apply-templates select="$configXml/gamedata/games/game" />
(本文系从原博客迁移至此,并进行部分编辑。原文链接:http://thewaychung.iteye.com/blog/2072740)
Java+XSL合并多个XML文件的更多相关文章
- JAVA中通过Jaxp操作XML文件基础
Java中有多种方式操作XML文件,目前讲一讲以SUN公司提供的DocumentBuilderFactory工厂类对象操作XML. 使用XML基本操作就是需要CRUD(增删改查),那么首先通过一个查询 ...
- Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)
相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...
- 使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置
1.使用java代码动态配置与xml文件结合的方式使用mybatis-generator生成代码配置 2.上代码:在resources目录下新建:generatorConfiguration.xml文 ...
- JAVA中使用DOM解析XML文件
XML是一种方便快捷高效的数据保存传输的格式,在JSON广泛使用之前,XML是服务器和客户端之间数据传输的主要方式.因此,需要使用各种方式,解析服务器传送过来的信息,以供使用者查看. JAVA作为一种 ...
- java中采用dom4j解析xml文件
一.前言 在最近的开发中用到了dom4j来解析xml文件,以前听说过来解析xml文件的几种标准方式:但是从来的没有应用过来,所以可以在google中搜索dmo4j解析xml文件的方式,学习一下dom4 ...
- Spring MVC框架下在java代码中访问applicationContext.xml文件中配置的文件(可以用于读取配置文件内容)
<bean id="propertyConfigurer" class="com.****.framework.core.SpringPropertiesUtil& ...
- java代码用dom4j解析xml文件的简单操作
时间: 2016/02/17 目标:为telenor的ALU Femto接口写一个采集xml文件并解析出locationName标签里的值,然后更新到数据库中. 从网上搜了下,有四种常用的解析xml的 ...
- java中利用dom4j解析XML文件
官网下载Dom4j地址:https://dom4j.github.io/ 注意:使用Dom4j开发,需下载dom4j相应的jar文件 题目:后台利用dom4j解析student.xml文件,并返回Li ...
- java struts2入门学习--基于xml文件的声明式验证
一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...
随机推荐
- mysql的下载地址+Download WinMD5
http://dev.mysql.com/downloads/mysql http://www.nullriver.com/products
- 使用CSS和JQuery实现表格单元格内容超出时部分隐藏,隐藏部分以...显示
1.使用CSS实现,给此单元格添加一个Class: width:130px; display:block; overflow:hidden; word-break:keep-all; white-sp ...
- iOS 伐码猿真爱—「偷懒 || 效率 工具类」
自检 代码不会可以多敲几次,学习的重点是思想:-- 认同. BUT 如果你把自己会的.熟知的.可以说写的似流水的代码,不管是在工作 或是 自学习中你还是一点一点的敲出来,是不是有点...,copy & ...
- java基础---->hashMap的简单分析(一)
HashMap是一种十分常用的数据结构对象,可以保存键值对.它在项目中用的比较多,今天我们就来学习一下关于它的知识. HashMap的简单使用 一.hashMap的put和get方法 Map<S ...
- 用Docker在一台笔记本电脑上搭建一个具有10个节点7种角色的Hadoop集群(上)-快速上手Docker
如果想在一台电脑上搭建一个多节点的Hadoop集群,传统的方式是使用多个虚拟机.但这种方式占用的资源比较多,一台笔记本能同时运行的虚拟机的数量是很有限的.这个时候我们可以使用Docker.Docker ...
- Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX
转自:http://brokendreams.iteye.com/blog/2250109 功能简介: 原子量和普通变量相比,主要体现在读写的线程安全上.对原子量的是原子的(比如多线程下的共享变量i+ ...
- jQuery库冲突解决办法
一次面试中面试官问到jQuery解决怎么冲突?虽然以前看过,但是我已经不记得了. 我的思路就是如果让我来设计,那我就用一个默认值$,不传参数,那就用$,最后就挂载在window.$上,传参数就用传入名 ...
- VR的技术问题是不是市场的绊脚石?
VR虽然现在很火,但是不得不说,VR虚拟现实设备现在还没有普及,而且虚拟现实设备要想像手机一样普及,还面临着很多的困难和挑战.当然最重要的是,VR虚拟现实设备要解决一些问题才可以,这些问题也是影响VR ...
- 【2017-05-21】WebForm内置对象:Session、Cookie,登录和状态保持
1.Request -获取请求对象 string s =Request["key"]; 2.Response - 响应请求对象 Response.Redirect(" ...
- Lua学习(2)——表达式
1. lua算术操作符lua支持的算数操作符: + - * /除 ^指数 %取模 -符号 2. lua关系操作符 <小于 >大于 <= >= == ~=不等于 3. 逻辑操作符 ...