使用Java解析XML文件有许多成熟的工具,如dom4j等等。但在一些场景中,我们可能使用Ant、Maven等构建工具对多个XML文件进行合并,我们希望可以直接通过脚本文件,或者简单的程序就能完成这样的功能,那么使用XSL是一个非常不错的选择。本文将介绍通过简单的Java程序加上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" />
相关推荐
通过xsl合并2个结构相同的xml文件成为一个
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。. 本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...
XSL全称是Extensible Stylesheet Language(可扩展样式语言), 是将来设计XML文档显示样式的主要文件类型。它本身也是基于XML语言的。使用XSL,你可以灵活的设置文档显示样式,文档将自动适应任何浏览器和PDA(掌上电脑...
3.1.3 将XML文件装入Web浏览器... 35 .2 考察简单的XML文档... 37 3.3 赋于XML标记以意义... 39 .4 为XML文档编写样式单... 40 .5 将样式单附加到XML文档上... 41 3.6 本章小结... 43 第4章 数据的结构化... ...
2、XML+XSL,展现和修改用两个XSL文件来做,Ajax修改、保存XML。3、GridView控件。 经过细致考虑,首先第三方案GridView控件满足不了需求,因为XML格式多样,可能涉及到很多的行、列合并和行、列表头合并。第一方案...
Cocoon最初的型态是一个简单的Java servlet,全部使用标准W3C组件:用文档对象模型(DOM)来解析文档,用XML来捕捉和格式化数据,用XSLT来转换数据和合并/操纵XML文档,并用XSL来管理文档的表示以便通过Web传送。...
• 1.3.htm 调用外部JavaScript文件 • 1.3.js 1.3.htm使用的外部JavaScript文件 第2章(\第2章) • 2.1.htm Infinity应用 • 2.2.htm NaN与isNaN()的用法 • 2.3.htm Infinity值...
12.1.3 定义XML格式的性能测试任务文件 325 12.1.4 Automation Center性能测试调度运行 329 12.1.5 性能测试报告诊断系统 330 12.2 核心技术及具体实现方法 332 12.2.1 性能测试数据源格式定义 332 12.2.2 测试程序...