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

中国希望77

中国希望77

2016-02-19 12:15

今天天气好晴朗处处好风光,好天气好开始,图老师又来和大家分享啦。下面给大家推荐Java中合并XML文档的设计与实现,希望大家看完后也有个好心情,快快行动吧!
摘 要:介绍了XML应用中合并XML文档的方法与应用,在基于XML的应用中,有着广泛的应用前景。

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

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

设计思想

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


实现过程

为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK1.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文档的过程。先说明一下各个方法的作用。方法isMerging()有两个参数(分别是目标XML文件名和被合并的XML文件名),调用JAVA的解析器,获得两个要合并的XML文档的Document结构和根元素,并调用方法duplicate()和方法write To()。当然,在XML文档的合并过程中,可以加入另外的一些判断条件,比如,当被合并XML文档不存在时,将如何处理,等等。

Private Boolean is Merging (String mainFileName, String subFilename) 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);
//复制节点的值
Textvalue 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中),可以测试如下:

Publicstatic voidmain (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 NOTbeen merged.");
}

总结

本文介绍了如何利用JAVA中的XML解析器,合并两个XML文档。当然,在合并的过程中,还可以加入其他的约束条件,比如要求过滤掉特定的元素等。另外,复制元素的插入位置也可以加以限制。
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
Java中合并XML文档的设计与实现

在Java中实现DOM文档和XML文件互相转换

编程语言 网络编程
在Java中实现DOM文档和XML文件互相转换

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

Java编程中更新XML文档的常用方法

Java JAVA基础
Java编程中更新XML文档的常用方法

Java实现用DOM文档和XML文件互换的操作

编程语言 网络编程
Java实现用DOM文档和XML文件互换的操作

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Word2019中多个文档的比较与合并操作

word
Word2019中多个文档的比较与合并操作

Java中ThreadLocal的设计与使用

Java JAVA基础
Java中ThreadLocal的设计与使用

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

Java咖啡馆(10):情人节的Applet

Java咖啡馆(10):情人节的Applet

html5指南-7.geolocation结合google maps开发一个小的应用

html5指南-7.geolocation结合google maps开发一个小的应用
下拉加载更多内容 ↓