摘 要:介绍了xml应用中合并xml文档的方法与应用,在基于xml的应用中,有着广泛的应用前景。
关键词:xml文档 解析器 元素
在xml应用中,最常用也最实用的莫过于xml文件的读写。由于xml语义比较严格,起始标记必须配对,所以合并xml文档并不像合并普通文件那样简单。在java中,如何合并xml文档,下面介绍一种方法。
设计思想
应用javax.xml.parsers包中的解析器解析得到两个xml文件的根元素,再采用递归的方式逐一复制被合并文件的元素。

实现过程
为了读写xml文件,需要导入如下java包,"//"后为注释说明,笔者的环境是jdk1.3.1,在jdk 1.4.0中测试也通过。
下面介绍合并xml文档的过程。先说明一下各个方法的作用。方法ismerging()有两个参数(分别是目标xml文件名和被合并的xml文件名),调用java的解析器,获得两个要合并的xml文档的document结构和根元素,并调用方法duplicate()和方法write to()。当然,在xml文档的合并过程中,可以加入另外的一些判断条件,比如,当被合并xml文档不存在时,将如何处理,等等。
方法dupliate ()有三个参数(分别是目标xml文档的document,目标xml文档中要添加节点的父节点和被合并xml文档的复制节点),采用递归的形式,将一个xml文档中的元素复制到另一个xml文档中。
方法writeto()有两个参数(分别是目标xml文档的document和文件名),将所得目标xml文档写入文件。
最后使用测试函数进行测试。对于两个已经存在的xml文件(比如,存在文件d:/a.xml和d:/b.xml,要将b.xml合并到a.xml中),可以测试如下:
总结
本文介绍了如何利用java中的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文档。当然,在合并的过程中,还可以加入其他的约束条件,比如要求过滤掉特定的元素等。另外,复制元素的插入位置也可以加以限制。
闽公网安备 35060202000074号