Dom4j解析XML文档
2016-07-04 09:53
183 查看
Dom4j解析XML文档
Dom4j也可以很方便完成XML文档的创建、元素的修改、文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好。#准备
首先,提供相关的jar包
Dom4jjar包下载:
jaxenjar下载:
和dom4j依赖或相关的jar:
Junit-jar下载:
其次,准备测试案例的部分代码:
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;@Beforepublicvoidinit(){reader=newSAXReader();}@Afterpublicvoiddestory(){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*/@TestpublicvoidcreateDocument(){//创建一篇文档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可以设置文档的DOCTYPEdoc.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")@TestpublicvoidmodifyDoc(){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*/@TestpublicvoidprintInfo(){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*/@TestpublicvoidremoveNode(){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的文本内容
相关文章推荐
- 修改Activity的继承类导致程序闪退
- 公司优势介绍项目备份
- VirtualBox安装教程
- Java中字符串拆分
- Linq-批量删除方法
- 判断string是否为null
- CSS 选择器
- iOS常用公共方法
- L2-006. 树的遍历(后序 中序 还原)
- $(window).on("load",function(){}和$(function(){})区别
- Android自定义View——绘制音乐播放器示波器
- SQLServer 中存储过程
- Mysql Got error 28 from storage engine错误
- R学习笔记(1)——ARIMA模型
- Android之片段Fragment的实践(二)
- UMeng崩溃日志分析
- 浏览器弹出小页面
- Unity制作 TweenScale 动画来回
- Ruby学习_self
- 【算法理解】—— 快速排序(三向切分)