分享
 
 
 

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

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

摘 要:介绍了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文档。当然,在合并的过程中,还可以加入其他的约束条件,比如要求过滤掉特定的元素等。另外,复制元素的插入位置也可以加以限制。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有