您的位置:首页 > 其它

Dom4j解析XML文档

2016-07-04 09:53 183 查看


Dom4j解析XML文档

Dom4j也可以很方便完成XML文档的创建、元素的修改、文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好。

#准备
首先,提供相关的jar包
Dom4jjar包下载:
http://sourceforge.net/projects/dom4j/files/dom4j-2.0.0-ALPHA-2/
jaxenjar下载:
http://repo1.maven.org/maven2/jaxen/jaxen/1.1.1/jaxen-1.1.1.jar
和dom4j依赖或相关的jar:
http://dom4j.sourceforge.net/dependencies.html
Junit-jar下载:
http://ebr.springsource.com/repository/app/bundle/version/download?name=com.springsource.org.junit&version=4.8.1&type=binary

其次,准备测试案例的部分代码:

packagecom.hoo.test;


importjava.io.File;

importjava.util.Iterator;

importjava.util.List;

importorg.dom4j.Attribute;

importorg.dom4j.Document;

importorg.dom4j.DocumentException;

importorg.dom4j.DocumentHelper;

importorg.dom4j.Element;

importorg.dom4j.Node;

importorg.dom4j.QName;

importorg.dom4j.dom.DOMAttribute;

importorg.dom4j.io.SAXReader;

importorg.dom4j.tree.BaseElement;

importorg.junit.After;

importorg.junit.Before;

importorg.junit.Test;


/**

*<b>function:</b>使用Dom4j操作XML

*@authorhoojo

*@createDate2011-8-5下午06:15:40

*@fileDocumentTest.java

*@packagecom.hoo.test

*@projectDom4jTest

*@blog'target='_blank'>http://blog.csdn.net/IBM_hoojo[/code]
*@emailhoojo_@126.com

*@version1.0

*/

publicclassDocumentTest{


privateSAXReaderreader=null;


@Before

publicvoidinit(){

reader=newSAXReader();

}


@After

publicvoiddestory(){

reader=null;

System.gc();

}


publicvoidfail(Objecto){

if(o!=null)

System.out.println(o);

}

}


#创建一篇XML文档
文档格式如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<catalog>

<!--AnXMLCatalog-->

<?targetinstruction?>

<journaltitle="XMLZone"publisher="IBMdeveloperWorks">

<articlelevel="Intermediate"date="December-2001">

<title>JavaconfigurationwithXMLSchema</title>

<author>

<firstname>Marcello</firstname>

<lastname>Vitaletti</lastname>

</author>

</article>

</journal>

</catalog>


创建文档代码如下:

/**

*<b>function:</b>创建文档

*@authorhoojo

*@createDate2011-8-5下午06:18:18

*/

@Test

publicvoidcreateDocument(){

//创建一篇文档

Documentdoc=DocumentHelper.createDocument();


//添加一个元素

Elementroot=doc.addElement("catalog");

//为root元素添加注释

root.addComment("AnXMLCatalog");

//添加标记

root.addProcessingInstruction("target","instruction");


//创建元素

ElementjournalEl=newBaseElement("journal");

//添加属性

journalEl.addAttribute("title","XMLZone");

journalEl.addAttribute("publisher","IBMdeveloperWorks");

root.add(journalEl);


//添加元素

ElementarticleEl=journalEl.addElement("article");

articleEl.addAttribute("level","Intermediate");

articleEl.addAttribute("date","December-2001");


ElementtitleEl=articleEl.addElement("title");

//设置文本内容

titleEl.setText("JavaconfigurationwithXMLSchema");

//titleEl.addText("JavaconfigurationwithXMLSchema");


ElementauthorEl=articleEl.addElement("author");

authorEl.addElement("firstname").setText("Marcello");

authorEl.addElement("lastname").addText("Vitaletti");


//可以使用addDocType()方法添加文档类型说明。

doc.addDocType("catalog",null,"file://c:/Dtds/catalog.dtd");


fail(doc.getRootElement().getName());


//将xml转换成文本

fail(doc.asXML());


//写入到文件

/*XMLWriteroutput;

try{

output=newXMLWriter(newFileWriter(newFile("file/catalog.xml")));

output.write(doc);

output.close();

}catch(IOExceptione){

e.printStackTrace();

}*/

}


*DocumentHelper是一个文档助手类(工具类),它可以完成文档、元素、文本、属性、注释、CDATA、Namespace、XPath的创建,以及利用XPath完成文档的遍历和将文本转换成Document;
parseText完成将xml字符串转换成Doc的功能

Documentdoc=DocumentHelper.parseText("<root></root>");


createDocument创建一个文档

Documentdoc=DocumentHelper.createDocument();


如果带参数就会创建一个带有根元素的文档

createElement创建一个元素

Elementel=DocumentHelper.createElement("el");


*Document的addElement方法可以给当前文档添加一个子元素

Elementroot=doc.addElement("catalog");


*addComment方法可以添加一段注释

root.addComment("AnXMLCatalog");


为root元素添加一段注释

*addProcessingInstruction添加一个标记

root.addProcessingInstruction("target","instruction");


为root元素添加一个标记

*newBaseElement可以创建一个元素

ElementjournalEl=newBaseElement("journal");


*addAttribute添加属性

journalEl.addAttribute("title","XMLZone");


*add添加一个元素

root.add(journalEl);


将journalEl元素添加到root元素中

*addElement添加一个元素,并返回当前元素

ElementarticleEl=journalEl.addElement("article");


给journalEl元素添加一个子元素article

*setText、addText可以设置元素的文本

authorEl.addElement("firstname").setText("Marcello");
authorEl.addElement("lastname").addText("Vitaletti");


*addDocType可以设置文档的DOCTYPE

doc.addDocType("catalog",null,file://c:/Dtds/catalog.dtd);


*asXML可以将文档或元素转换成一段xml字符串

doc.asXML();
root.asXML();


*XMLWriter类可以把文档写入到文件中

output=newXMLWriter(newFileWriter(newFile("file/catalog.xml")));
output.write(doc);
output.close();


#修改XML文档内容

/**

*<b>function:</b>修改XML内容

*@authorhoojo

*@createDate2011-8-9下午03:37:04

*/

@SuppressWarnings("unchecked")

@Test

publicvoidmodifyDoc(){

try{

Documentdoc=reader.read(newFile("file/catalog.xml"));


//修改属性内容

Listlist=doc.selectNodes("//article/@level");

Iterator<Attribute>iter=list.iterator();

while(iter.hasNext()){

Attributeattr=iter.next();

fail(attr.getName()+"#"+attr.getValue()+"#"+attr.getText());

if("Intermediate".equals(attr.getValue())){

//修改属性值

attr.setValue("Introductory");

fail(attr.getName()+"#"+attr.getValue()+"#"+attr.getText());

}

}


list=doc.selectNodes("//article/@date");

iter=list.iterator();

while(iter.hasNext()){

Attributeattr=iter.next();

fail(attr.getName()+"#"+attr.getValue()+"#"+attr.getText());

if("December-2001".equals(attr.getValue())){

//修改属性值

attr.setValue("December-2011");

fail(attr.getName()+"#"+attr.getValue()+"#"+attr.getText());

}

}


//修改节点内容

list=doc.selectNodes("//article");

Iterator<Element>it=list.iterator();

while(it.hasNext()){

Elementel=it.next();

fail(el.getName()+"#"+el.getText()+"#"+el.getStringValue());

//修改title元素

Iterator<Element>elIter=el.elementIterator("title");

while(elIter.hasNext()){

ElementtitleEl=elIter.next();

fail(titleEl.getName()+"#"+titleEl.getText()+"#"+titleEl.getStringValue());

if("JavaconfigurationwithXMLSchema".equals(titleEl.getTextTrim())){

//修改元素文本值

titleEl.setText("ModifytheJavaconfigurationwithXMLSchema");

fail(titleEl.getName()+"#"+titleEl.getText()+"#"+titleEl.getStringValue());

}

}

}


//修改节点子元素内容

list=doc.selectNodes("//article/author");

it=list.iterator();

while(it.hasNext()){

Elementel=it.next();

fail(el.getName()+"#"+el.getText()+"#"+el.getStringValue());

List<Element>childs=el.elements();

for(Elemente:childs){

fail(e.getName()+"#"+e.getText()+"#"+e.getStringValue());

if("Marcello".equals(e.getTextTrim())){

e.setText("Ayesha");

}elseif("Vitaletti".equals(e.getTextTrim())){

e.setText("Malik");

}

fail(e.getName()+"#"+e.getText()+"#"+e.getStringValue());

}

}


//写入到文件

/*XMLWriteroutput=newXMLWriter(newFileWriter(newFile("file/catalog-modified.xml")));

output.write(doc);

output.close();*/

}catch(DocumentExceptione){

e.printStackTrace();

}catch(Exceptione){

e.printStackTrace();

}

}


*reader.read(newFile("file/catalog.xml"));读取指定xml文件内容到文档中;
*selectNodes是XPath的查询方法,完成xml文档的查询,传递xpath路径。其使用方法可以参考jdom的xpath的使用方法:
/article/4791897.html
*getName获取元素标签名称、getValue、getText获取值、文本内容;
*elementIterator("title");获取当前节点下所有的title元素,返回Iterator;
*elements获取下面所有的子元素,返回的是一个集合List;

#显示文档相关信息

privateStringformat(inti){

Stringtemp="";

while(i>0){

temp+="--";

i--;

}

returntemp;

}


/**

*<b>function:</b>递归显示文档内容

*@authorhoojo

*@createDate2011-8-9下午03:43:45

*@parami

*@paramels

*/

privatevoidprint(inti,List<Element>els){

i++;

for(Elementel:els){

fail(format(i)+"##"+el.getName()+"#"+el.getTextTrim());

if(el.hasContent()){

print(i,el.elements());

}

}

}


/**

*<b>function:</b>显示文档相关信息

*@authorhoojo

*@createDate2011-8-9下午03:44:10

*/

@Test

publicvoidprintInfo(){

try{

Documentdoc=reader.read(newFile("file/catalog.xml"));

fail("asXML:"+doc.asXML());


fail(doc.asXPathResult(newBaseElement("article")));

List<Node>list=doc.content();

for(Nodenode:list){

fail("Node:"+node.getName()+"#"+node.getText()+"#"+node.getStringValue());

}


fail("-----------------------------");

print(0,doc.getRootElement().elements());


fail("getDocType:"+doc.getDocType());

fail("getNodeTypeName:"+doc.getNodeTypeName());

fail("getPath:"+doc.getRootElement().getPath());

fail("getPath:"+doc.getRootElement().getPath(newBaseElement("journal")));

fail("getUniquePath:"+doc.getRootElement().getUniquePath());

fail("getXMLEncoding:"+doc.getXMLEncoding());

fail("hasContent:"+doc.hasContent());

fail("isReadOnly:"+doc.isReadOnly());

fail("nodeCount:"+doc.nodeCount());

fail("supportsParent:"+doc.supportsParent());

}catch(DocumentExceptione){

e.printStackTrace();

}

fail("getEncoding:"+reader.getEncoding());

fail("isIgnoreComments:"+reader.isIgnoreComments());

fail("isMergeAdjacentText:"+reader.isMergeAdjacentText());

fail("isStringInternEnabled:"+reader.isStringInternEnabled());

fail("isStripWhitespaceText:"+reader.isStripWhitespaceText());

fail("isValidating:"+reader.isValidating());

}


#删除文档内容

/**

*<b>function:</b>删除节点内容

*@authorhoojo

*@createDate2011-8-9下午03:47:44

*/

@Test

publicvoidremoveNode(){

try{

Documentdoc=reader.read(newFile("file/catalog-modified.xml"));

fail("comment:"+doc.selectSingleNode("//comment()"));

//删除注释

doc.getRootElement().remove(doc.selectSingleNode("//comment()"));


Elementnode=(Element)doc.selectSingleNode("//article");

//删除属性

node.remove(newDOMAttribute(QName.get("level"),"Introductory"));

//删除元素节点

node.remove(doc.selectSingleNode("//title"));


//只能删除下一级节点,不能超过一级;(需要在父元素的节点上删除子元素)

NodelastNameNode=node.selectSingleNode("//lastname");

lastNameNode.getParent().remove(lastNameNode);


fail("Text:"+doc.selectObject("//*[text()='Ayesha']"));

ElementfirstNameEl=(Element)doc.selectObject("//firstname");

fail("Text:"+firstNameEl.selectSingleNode("text()"));


//删除text文本

//firstNameEl.remove(firstNameEl.selectSingleNode("text()"));

//firstNameEl.remove(doc.selectSingleNode("//firstname/text()"));

firstNameEl.remove(doc.selectSingleNode("//*[text()='Ayesha']/text()"));


//删除子元素author

//node.remove(node.selectSingleNode("//author"));


fail(doc.asXML());

}catch(Exceptione){

e.printStackTrace();

}

}


*删除注释

doc.getRootElement().remove(doc.selectSingleNode("//comment()"));


删除root元素下面的注释

*删除属性

node.remove(newDOMAttribute(QName.get("level"),"Introductory"));


删除node节点中的名称为level,其值为Introductory的属性

*删除元素

node.remove(doc.selectSingleNode("//title"));


删除node节点下的title元素

*删除文本

firstNameEl.remove(firstNameEl.selectSingleNode("text()"));
firstNameEl.remove(doc.selectSingleNode("//firstname/text()"));
firstNameEl.remove(doc.selectSingleNode("//*[text()='Ayesha']/text()"));


删除firstNameEl的文本内容
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: