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 声明 ...
随机推荐
- 学习笔记:javascript内置对象:字符串对象
1.字符串的创建 var str = "Hello Microsoft!"; 2.字符串属性 constructor 返回创建字符串属性的函数 length ...
- anjular中Service、Factory、Provider的使用与js中创建对象的总结
在学习anjular中Service的使用时,发现和js中的创建对象的方式有一定的联系,所以总结了anjular中Service.Factory.Provider的使用方式与js创建对象的方式 一.先 ...
- Servlet,过滤器,监听器,拦截器的区别
1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml ...
- JAVA的Executor框架
Executor框架分离了任务的创建和执行.JAVA SE5的java.util.concurrent包中的执行器(Executor)管理Thread对象,从而简化了并发编程.Executor引入了一 ...
- C#之自定义特性
在前面介绍的代码中有使用特性,这些特性都是Microsoft定义好的,作为.NET Framework类库的一部分,许多特性都得到了C#编译器的支持. .NET Frmework也允许定义自己的特性. ...
- .Net Core中使用ref和Span<T>提高程序性能
一.前言 其实说到ref,很多同学对它已经有所了解,ref是C# 7.0的一个语言特性,它为开发人员提供了返回本地变量引用和值引用的机制. Span也是建立在ref语法基础上的一个复杂的数据类型,在文 ...
- Day4-内置函数--未完待续,慢慢写
内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii 未完待续....
- 在微信小程序中学习flex布局
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就 ...
- 创建发布自己的npm包
我们基于nodejs平台上面的npm上,可以随意下载很多npm安装包.那我们如何创建自己的npm包呢?很简单,废话少说,开始做~ 开始做之前nodejs默认是要安装的,怎么安装自行百度其他教程. 首先 ...
- Smart.coder每日站立会议08
站立会议内容: 完善小程序的查找功能,打算考虑一下信息自动输入分类的功能. 1.站立会议照片: 2.任务展板 3.燃尽图