java合并xml

sd8089730 贡献于2012-09-25

作者 wwh  创建于2010-07-28 01:45:00   修改者wwh  修改于2010-07-28 01:48:00字数4145

文档摘要:摘 要:介绍了XML应用中合并XML文档的方法与应用,在基于XML的应用中,有着广泛的应用前景。 在XML应用中,最常用也最实用的莫过于XML文件的读写。由于XML语义比较严格,起始标记必须配对,所以合并XML文档并不像合并普通文件那样简单。在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文档。当然,在合并的过程中,还可以加入其他的约束条件,比如要求过滤掉特定的元素等。另外,复制元素的插入位置也可以加以限制。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档