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 声明 ...
随机推荐
- R语言结合概率统计的体系分析---数字特征
现在有一个人,如何对这个人怎么识别这个人?那么就对其存在的特征进行提取,比如,提取其身高,其相貌,其年龄,分析这些特征,从而确定了,这个人就是这个人,我们绝不会认错. 同理,对数据进行分析,也是提取出 ...
- 转:Java中的Clone()方法详解
Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那 ...
- Bootstrap学习笔记之文本对齐风格
文本对齐风格 在排版中离不开文本的对齐方式.在CSS中常常使用text-align来实现文本的对齐风格的设置.其中主要有四种风格: ☑ 左对齐,取值left ☑ 居中对齐,取值center ☑ ...
- jmeter将参数值写入到指定文件
有时在测试过程中需要将测试过程中生成的参数保存下来,jmeter并没有此类功能,此时,可以 通过beanshell编写代码来实现 思路: 每次请求响应返回后,通过正则表达式获取到需要保存的值,通过Be ...
- RPi WiringPi安装使用
sudo apt-get install git-core git clone git://git.drogon.net/wiringPi cd wiringPi ./build 使用Exam ...
- Spring-bean作用域scope详解
Spring Framework支持五种作用域(其中有三种只能用在基于web的Spring ApplicationContext). singleton 在每个Spring IoC容器中一个bean定 ...
- linux不需要密码ssh登陆
1. 自动ssh/scp方法A为本地主机(即用于控制其他主机的机器) ;B为远程主机(即被控制的机器Server), 假如ip为192.168.60.110;A和B的系统都是Linux在A上运行命令: ...
- cas4.2.7 取消https
cas.properties 修改两个地方 # Decides whether SSO cookie should be created only under secure connections. ...
- 【java8】慎用java8的foreach循环
虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8,推荐一本书还是不错的<写给大忙人看的javase8>.因为学习了Java8,所以只要能用到的地方都会去用,尤其是 ...
- C# 类型基础(中)
前一篇文章中我们讲到了值类型和引用类型的一些区别,那这篇我们将深入的分析一下到底有什么不一样 先总结一下两者的差别: 黄金法则: 1.引用类型总是被分配到托管堆上. 2.值类型总是分配到它声明的地方: ...