`
thewaychung
  • 浏览: 22863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java+XSL合并XML文件

    博客分类:
  • Java
阅读更多

使用Java解析XML文件有许多成熟的工具,如dom4j等等。但在一些场景中,我们可能使用Ant、Maven等构建工具对多个XML文件进行合并,我们希望可以直接通过脚本文件,或者简单的程序就能完成这样的功能,那么使用XSL是一个非常不错的选择。本文将介绍通过简单的Java程序加上XSL文件来完成多个XML文件的合并操作。

 

背景

  1. Config.xml文件的结构与FinalConfig.xml文件相似;
  2. 需要将Config.xml文件的内容合并到FinalConfig.xml文件;
  3. 若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" />

 

 

 

 

 

 

分享到:
评论
1 楼 龙纳尔东 2016-08-16  
太好了,正想学习xsl,看了这篇文章,收益匪浅。

相关推荐

    java合并xml1

    下面,我们将深入探讨如何在Java中有效地合并XML文件。 首先,我们需要了解XML的基本结构。一个XML文件由元素(Elements)、属性(Attributes)、文本内容(Text Content)等组成。在Java中,我们通常使用DOM...

    合并2个结构相同的xml文件

    在本次的任务中,我们将探讨如何使用XSL来合并两个结构相同的XML文件。 首先,理解XML文件的结构至关重要。XML文件由一系列元素组成,每个元素都有一个唯一的标签,可以包含文本、属性以及子元素。当两个XML文件...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    本书共分4部分,从xml、servlet、jsp和应用的角度向读者展示了java web开发中各种技术的应用,循序渐进地引导读者快速掌握java web开发。.  本书内容全面,涵盖了从事java web开发所应掌握的所有知识。在知识的讲解...

    基于java根据模板动态生成PDF文件

    Apache FOP( Formatting Objects Processor)是Apache XML Graphics项目的一部分,主要用于将XSL-FO(XSL格式化对象)转换为各种输出格式,包括PDF。如果你的模板是基于XSL-FO,那么FOP是一个很好的选择。不过,XSL...

    ant daily build 学习五(findbugs多文件合并细节问题)

    `UnionResults.java`可能是实现这个转换逻辑的Java代码,它可能包含了读取XML报告、解析FindBugs结果、去重和合并的功能。这个类可能会使用DOM或SAX解析器来处理XML,使用XPath来定位和提取特定的FindBugs问题,然后...

    xml高级编程.

    - XSLT(XSL Transformations):转换XML文档,实现格式化、合并、提取等功能。 - LINQ to XML(C#):.NET Framework提供的XML查询API,类似于SQL。 6. 实战示例: - XML配置文件:许多应用程序用XML存储配置...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    XSL全称是Extensible Stylesheet Language(可扩展样式语言), 是将来设计XML文档显示样式的主要文件类型。它本身也是基于XML语言的。使用XSL,你可以灵活的设置文档显示样式,文档将自动适应任何浏览器和PDA(掌上电脑...

    XML实用大全----xml详细参考书

    3.1.3 将XML文件装入Web浏览器... 35 .2 考察简单的XML文档... 37 3.3 赋于XML标记以意义... 39 .4 为XML文档编写样式单... 40 .5 将样式单附加到XML文档上... 41 3.6 本章小结... 43 第4章 数据的结构化... ...

    javascript 读取XML数据,在页面中展现、编辑、保存的实现

    2、XML+XSL,展现和修改用两个XSL文件来做,Ajax修改、保存XML。3、GridView控件。 经过细致考虑,首先第三方案GridView控件满足不了需求,因为XML格式多样,可能涉及到很多的行、列合并和行、列表头合并。第一方案...

    JAVA 记事本记事本 程序程序

    XSL(Extensible Stylesheet Language)是一种样式表语言,用于转换XML文档的结构和格式。在JAVA记事本程序中,可能使用到XSLT(XSL Transformations)来将程序内部的文本数据转换成HTML或其他格式,便于查看或打印...

    XSLT-Mastering.XML.Transformations

    XSLT还支持合并多个XML文档,这通常通过`document()`函数实现。该函数可以从外部资源加载XML数据,并将其与当前文档结合,从而实现数据的聚合和集成。 ### 扩展XSLT 除了标准的XSLT功能,开发者还可以通过自定义...

    XML考试复习大纲及参考

    - **引入原因**:当多个来源的XML文档合并时,可能会出现标签名重复的问题。 #### 第四章:DTD(Document Type Definition) - **4.1 DTD的作用** - 定义了XML文档的合法结构。 - **4.2 DTD元素** - **元素...

    XSLT(XML)

    document() 函数是 XSLT 中用于合并多个 XML 文档的关键函数。它可以从外部文件加载数据并将其插入到输出文档中。 ##### 7.2 使用 document() 函数的技巧 了解如何有效地使用 document() 函数是实现复杂文档合并的...

    fop1.1相关资源

    4. **API集成**:FOP还提供了一个Java API,允许开发者在应用程序中直接集成FOP,以便于在处理XML数据时动态生成PDF。 5. **支持的输出格式**:除了PDF,FOP1.1还可以生成PS、PNG、JPEG、TIFF、SVG和AFP等格式的...

    网上淘宝--网络资源检索\XML 路径语言(XPath) 版本 1.0.

    XPath 1.0版本于1999年11月16日发布,作为一个稳定且推荐使用的规范,其目标是为XSLT(XSL转换)和XPointer提供一个共同的基础,同时也支持XML文档的元素寻址。 XPath的核心概念是路径表达式,这些表达式可以用来...

    MathML 与 Latex 互转

    MathML是一种XML(eXtensible Markup Language)标准,它允许网页和文档中精确地表示复杂的数学表达式。而LaTeX则是一种基于TeX的文字处理系统,特别适合于排版科技论文、报告和书籍,尤其是包含大量数学公式的文档...

    读写pdf文件的程序开发库

    - Apache FOP:这是一个XSL-FO处理器,可以将XML格式转换为PDF,适合生成结构化的PDF文档。 - PDFsharp:这个.NET库提供了创建、编辑和合并PDF文件的能力,支持添加文本、图像、形状和注释。 - ReportLab:Python...

Global site tag (gtag.js) - Google Analytics