`
jiqimiao
  • 浏览: 63754 次
  • 性别: Icon_minigender_1
  • 来自: 常州
社区版块
存档分类
最新评论

Java中合并XML文档的设计与实现

 
阅读更多
  摘 要:介绍了XML应用中合并XML文档的方法与应用,在基于XML的应用中,有着广泛的应用前景。

  关键词:XML文档 解析器 元素

  在XML应用中,最常用也最实用的莫过于XML文件的读写。由于XML语义比较严格,起始标记必须配对,所以合并XML文档并不像合并普通文件那样简单。在JAVA中,如何合并XML文档,下面介绍一种方法。

  设计思想

  应用javax.xml.parsers包中的解析器解析得到两个XML文件的根元素,再采用递归的方式逐一复制被合并文件的元素。


  实现过程

  为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK 1.3.1,在JDK 1.4.0中测试也通过。

Import java.io. *; //Java基础包,包含各种IO操作
Import java.util. *; //Java基础包,包含各种标准数据结构操作
Import javax.xml.parsers. *; //XML解析器接口
Import org.w3c.dom. *; //XML的DOM实现
import org.apache.crimson.tree.XmlDocument;//写XML文件要用到
Import javax.xml.transform. *;
Import javax.xml.transform.dom. *;
Import javax.xml.transform.stream. *;

  下面介绍合并XML文档的过程。先说明一下各个方法的作用。方法is Merging()有两个参数(分别是目标XML文件名和被合并的XML文件名),调用JAVA的解析器,获得两个要合并的XML文档的Document结构和根元素,并调用方法duplicate()和方法write To()。当然,在XML文档的合并过程中,可以加入另外的一些判断条件,比如,当被合并XML文档不存在时,将如何处理,等等。

Private Boolean is Merging (String mainFileName, String sub Filename) throws Exception {
 Boolean isOver = false;
 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 Document Builder db = null;
 Try {
  Db = dbf.newDocumentBuilder ();
 } Catch (ParserConfigurationException pce) {
  System.err.println(pce); //出现异常时,输出异常信息
 }
 Document doc_main = null,doc_vice = null;
 //获取两个XML文件的Document。
 Try {
  Doc_main = db.parse (mainFileName);
  Doc_vice = db.parse (sub Filename);
 } Catch (DOM Exception dom) {
  System.err.println (dom.getMessage ());
 } Catch (Exception ioe) {
  System.err.println (ioe);
 }
 //获取两个文件的根元素。
 Element root_main = doc_main.getDocumentElement ();
 Element root_vice = doc_vice.getDocumentElement ();
 //下面添加被合并文件根节点下的每个元素
 Novelist message Items = root_vice.getChildNodes ();
 Int item_number = messageItems.getLength ();
 //如果去掉根节点下的第一个元素,比如<所属管理系统> ,那么i从3开始。否则i从1开始。
 For (int i=1; i < item_number; i=i+2 ) {
  //调用dupliate(),依次复制被合并XML文档中根节点下的元素。
  Element messageItem = (Element) messageItems.item (i);
  IsOver = dupliate (doc_main, root_main, messageItem);
 }
 //调用 write To(),将合并得到的Document写入目标XML文档。
 Boolean isWritten = write To (doc_main, mainFileName);
 Return isOver && isWritten;
}

  方法dupliate ()有三个参数(分别是目标XML文档的Document,目标XML文档中要添加节点的父节点和被合并XML文档的复制节点),采用递归的形式,将一个XML文档中的元素复制到另一个XML文档中。

Private Boolean dupliate (Document doc_dup, Element father, Element son) throws Exception {
 Boolean is done = false;
 String son_name = son.getNodeName ();
 Element sub ITEM = doc_dup.createElement (son_name);
 //复制节点的属性
 If (son.hasAttributes ()){
  NamedNodeMap attributes = son.getAttributes ();
  For (int i=0; i < attributes.getLength () ; i ++){
   String attribute_name = attributes. Item (i). GetNodeName ();
   String attribute_value = attributes. Item (i). GetNodeValue ();
   SubITEM.setAttribute (attribute_name, attribute_value);
  }
 }
 Father.appendChild (sub ITEM);
 //复制节点的值
 Text value son = (Text) son.getFirstChild ();
 String nodevalue_root = "";
 If (value_son! = null && value_son.getLength () > 0) nodevalue_root = (String) value_son.getNodeValue ();
 Text valuenode_root = null;
 If ((nodevalue_root! = null)&&(nodevalue_root.length () > 0)) valuenode_root = doc_dup.createTextNode (nodevalue_root);
 If (valuenode_root! = null && valuenode_root.getLength () > 0) subITEM.appendChild (valuenode_root);
 //复制子结点
 Novelist sub_messageItems = son.getChildNodes ();
 int sub_item_number = sub_messageItems.getLength();
 if (sub_item_number < 2){
  //如果没有子节点,则返回
  Is done = true;
 }
 Else {
  For (int j = 1; j < sub_item_number; j=j+2) {
   //如果有子节点,则递归调用本方法
   Element sub_messageItem = (Element) sub_messageItems.item (j);
   Is done = dupliate (doc_dup, subITEM, sub_messageItem);
  }
 }
 Return is done;
}

  方法writeTo()有两个参数(分别是目标XML文档的Document和文件名),将所得目标XML文档写入文件。

Private Boolean write To (Document doc, String fileName) throws Exception {
 Boolean isOver = false;
 DOM Source doms = new DOM Source (doc);
 File f = new File (fileName);
 Stream Result sr = new Stream Result (f);
 Try
 {
  Transformer Factory tf=TransformerFactory.newInstance ();
  Transformer t=tf.newTransformer ();
  Properties properties = t.getOutputProperties ();
  Properties.setProperty (OutputKeys.ENCODING,"GB2312");
  T.setOutputProperties (properties);
  T.transform (doms, sr);
  IsOver = true;
 }
 Catch (TransformerConfigurationException tce)
 {
  Tce.printStackTrace ();
 }
 Catch (Transformer Exception te)
 {
  Te.printStackTrace ();
 }
 Return isOver;
}

  最后使用测试函数进行测试。对于两个已经存在的XML文件(比如,存在文件D:/a.xml和D:/b.xml,要将b.xml合并到a.xml中),可以测试如下:

Public static void main (String [] args) throws Exception {
 Boolean is done = is Merging ("D:/a.xml","D:/b.xml");
 If (is Done) System.out.println ("XML files have been merged.");
 Else System.out.println ("XML files have NOT been merged.");
}

  总结

  本文介绍了如何利用JAVA中的XML解析器,合并两个XML文档。当然,在合并的过程中,还可以加入其他的约束条件,比如要求过滤掉特定的元素等。另外,复制元素的插入位置也可以加以限制。
<!--广告代码开始--><script type="text/javascript"> var ad_cid; if (window.location.search.substring(1) != "") { ad_cid = window.location.search.substring(1); } else { ad_cid = 412; } </script><!--小通栏:c-scolumn顶部500*90--> <script language="JavaScript" type="text/javascript"> document.getElementById("ad1").innerHTML=document.getElementById("span_ad1").innerHTML; document.getElementById("span_ad1").innerHTML=""; </script><!--c-pip文章正文中间240*200--> <script type="text/javascript"> if(document.getElementById("contentAdv")) { document.getElementById("contentAdv").innerHTML=document.getElementById("span_ad3").innerHTML; document.getElementById("span_ad3").innerHTML=""; } else { document.getElementById("ad3").innerHTML=document.getElementById("span_ad3").innerHTML; document.getElementById("span_ad3").innerHTML=""; }</script><!--c-text-1“您现在的位置”右侧文字--> <script language="JavaScript" type="text/javascript"> document.getElementById("ad2").innerHTML=document.getElementById("span_ad2").innerHTML; document.getElementById("span_ad2").innerHTML=""; </script><!--c-column-2“标题”上面的广告--> <script language="JavaScript" type="text/javascript"> document.getElementById("ad10").innerHTML=document.getElementById("span_ad10").innerHTML; document.getElementById("span_ad10").innerHTML=""; </script><!--c-column-1“摘要”下面的广告--> <script language="JavaScript" type="text/javascript"> document.getElementById("ad9").innerHTML=document.getElementById("span_ad9").innerHTML; document.getElementById("span_ad9").innerHTML=""; </script><!--广告代码结束-->
<iframe src="http://media.yesky.com/adjs/iframe-column/imp7.htm" frameborder="0" width="0" scrolling="no" height="0"></iframe> <script language="JavaScript1.1" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-chinabyte_js&amp;dt=1175331407125&amp;hl=zh-CN&amp;gl=CN&amp;adsafe=high&amp;oe=gb&amp;lmt=1175331407&amp;num_ads=3&amp;output=js&amp;channel=soft&amp;url=http%3A%2F%2Fdev.yesky.com%2F490%2F2013490.shtml&amp;ref=http%3A%2F%2Fdev.yesky.com%2Fjavagaoji%2Fxml%2F&amp;cc=100&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=16&amp;u_tz=480&amp;u_java=true" type="text/javascript"></script>
分享到:
评论

相关推荐

    java合并xml1

    对于题目中的"java合并xml1",我们可以采用以下几种方法: 1. **DOM解析器合并**: 使用JDOM或Apache的DOM解析库(如`org.w3c.dom`)读取XML文件,将它们转换为DOM对象。然后,可以遍历这些DOM对象,将它们的子...

    java 使用POI合并两个word文档.docx

    Java 是一种流行的编程语言,POI(Poor Obfuscation Implementation)是一个流行的 Java 库,用于操作 Microsoft Office 文件,包括 Word 文档。合并两个 Word 文档是指将两个独立的 Word 文档合并成一个新的 Word ...

    Java DOM 生成XML

    Java DOM(Document Object Model)是一种基于树形结构的XML文档处理模型,它允许程序员通过对象接口来访问和操作XML文档的各个部分。DOM为XML文档提供了一种内存中的表示方式,使得开发人员可以方便地创建、修改和...

    java实现多个docx文档合并(基于docx4j)

    在Java编程环境中,合并多个docx文档是一项常见的需求,特别是在处理大量Word文档的工作场景中。本文将详细介绍如何使用Java和docx4j库来实现这一功能。docx4j是一个强大的开源库,专门用于处理Microsoft Office ...

    Java SAX解析Xml文档Demo

    总的来说,Java中的SAX解析XML文档是一种高效且灵活的方式,尤其适用于处理大文件或资源有限的环境。通过创建自定义的事件处理器,我们可以精确地控制解析过程,只处理关心的数据,而忽略其他部分,从而优化性能。

    java pdf合并实例

    在Java开发中,PDF文档处理是一项常见的任务,特别是在企业级应用中,可能需要将多个PDF文件合并成一个,便于管理和阅读。本实例将探讨如何使用Java进行PDF合并,特别是通过iText库实现这一功能。 iText是一个开源...

    Java实现PDF读写(Itext)与解析XML读写(Dom4j)

    7、将多个PDF(D:\\zhouyl\\FYImagePdf文件,D:\\zhouyl\\BTImagePDF文件)合并生成一个PDF文件:D:\\zhouyl\\合并MergePDF.pdf 二、用Java语言(Dom4j)完成了以下XMLToVds、TxtToVDS功能: 项目文件为TxtToVDS....

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

    总的来说,通过XSL和XSLT,我们可以灵活地操作XML文档,实现数据的合并、转换和格式化。这在处理大量结构化数据时尤其有用,特别是在需要整合多个数据源或者统一数据格式的场景下。熟练掌握这些技能,对于任何IT专业...

    java excel poi合并单元格

    在Java编程中,Apache POI库是一个非常流行的用于读写Microsoft Office格式文件的库,包括Excel。本篇文章将深入探讨如何使用Apache POI来合并Excel工作表中的单元格,以实现标题或者表头的美化。 首先,理解Excel...

    java读取XML文件内容的四种方法[归类].pdf

    JDOM 是一种 Java 特定文档模型,旨在简化与 XML 的交互并且比使用 DOM 实现更快。JDOM 使用具体类而不使用接口,简化了 API。但是,它也限制了灵活性。JDOM 还大量使用了 Collections 类,简化了那些已经熟悉这些类...

    java运用poi填充word数据并将多个word合并为一个

    本篇文章将详细讲解如何利用Apache POI库在Java中实现Word文档的数据填充以及多文件合并。 1. **Apache POI简介** Apache POI是一个开源项目,提供了一组API来处理Microsoft Office格式的文件,如DOCX(Word 2007...

    java多个PDF文件合并为一个PDF文件源码

    在Java编程环境中,合并多个PDF...通过上述代码,你可以在Java项目中实现将PDF文件夹中的多个PDF文件合并为一个PDF文件。请确保在运行代码之前,已经正确配置了PDFBox库,并且提供的文件夹路径包含了要合并的PDF文件。

    用zeus实现xml与java之间的转换

    标题中的“用zeus实现xml与java之间的转换”是指利用Zeus工具将XML文档的数据转换成Java对象,或者将Java对象的数据序列化成XML文档。这个过程是XML Binding(XML绑定)的一部分,使得XML和Java代码能够交互,方便...

    Java将图片合并为视频

    在Java编程环境中,将一系列图片合并成视频是一个常见的多媒体处理任务。这个项目文件提供了一种实现方式,让我们来深入探讨一下这个过程中的关键知识点。 首先,我们要了解的是Java中的多媒体处理库。在这个项目中...

    多个xmind文件合并

    在这种情况下,通过编程的方式,比如使用Java Swing来实现多个Xmind文件的合并,可以大大提高工作效率。下面将详细介绍如何使用Java Swing实现这一功能。 首先,我们需要了解Java Swing库。Swing是Java的一个图形...

    java使用stax技术操作XML文档.doc

    Streaming API for XML (StAX) 是Java中处理XML的一种高效且灵活的标准,相较于DOM和SAX,它在性能和易用性上有显著优势。...在处理大型或复杂XML文档时,StAX的流式处理特性可以显著降低内存占用和提高处理速度。

    java使用itext实现pdf文件下载

    现在,我们转向主题,即如何在Java中实现PDF文件的下载。有两种主要的方式: 1. **通过系统路径下载**:这种方式适用于后台生成PDF后,直接保存到服务器的某个路径,然后提供URL给用户下载。以下是一个简单的示例:...

    java:图片列表合并转pdf完整示例

    在Java编程环境中,将图片列表合并转换为PDF文档是一项常见的任务,特别是在报告生成、文档整理或数据可视化等场景。这个示例将详细讲解如何通过Java实现这一功能,包括必要的库引用、代码实现以及可能遇到的问题。 ...

    读取Excel数据生成XML文件

    综上所述,实现“读取Excel数据生成XML文件”的过程涉及到对Excel数据的处理、XML语法的理解,以及利用编程语言如Python中的工具进行转换。同时,提供详细的使用说明和资源链接可以帮助用户更好地理解和应用这个过程...

Global site tag (gtag.js) - Google Analytics