700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > DOM4J_Xpath的XML操作总结

DOM4J_Xpath的XML操作总结

时间:2022-07-18 21:12:47

相关推荐

DOM4J_Xpath的XML操作总结

独角兽企业重金招聘Python工程师标准>>>

1、DOM4J简介

DOM4J是出品的一个开源XML解析包。DOM4J应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。

Dom:把整个文档作为一个对象。

DOM4J最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:

接口之间的继承关系如下:

interface java.lang.Cloneable

interface org.dom4j.Node

interface org.dom4j.Attribute

interface org.dom4j.Branch

interface org.dom4j.Document

interface org.dom4j.Element

interface org.dom4j.CharacterData

interface org.dom4j.CDATA

interface ment

interface org.dom4j.Text

interface org.dom4j.DocumentType

interface org.dom4j.Entity

interface org.dom4j.ProcessingInstruction

2、XML文档操作1

2.1、读取XML文档:

读写XML文档主要依赖于org.dom4j.io包,有DOMReader和SAXReader两种方式。因为利用了相同的接口,它们的调用方式是一样的。

Java代码

publicstaticDocumentload(Stringfilename){

Documentdocument=null;

try{

SAXReadersaxReader=newSAXReader();

document=saxReader.read(newFile(filename));//读取XML文件,获得document对象

}catch(Exceptionex){

ex.printStackTrace();

}

returndocument;

}

Java代码

publicstaticDocumentload(URLurl){

Documentdocument=null;

try{

SAXReadersaxReader=newSAXReader();

document=saxReader.read(url);//读取XML文件,获得document对象

}catch(Exceptionex){

ex.printStackTrace();

}

returndocument;

}

// 读取指定的 xml 文件之后返回一个 Document 对象,这个对象代表了整个 XML 文档,用于各种 Dom 运算。执照 XML 文件头所定义的编码来转换。

2.2、获取根节点

根节点是xml分析的开始,任何xml分析工作都需要从根开始

Xml xml = new Xml();

Doument dom = xml.load(path + "/" + file);

Element root = dom.getRootElement();

2.3、新增一个节点以及其下的子节点与数据

Element menuElement = root.addElement("menu");

Element engNameElement = menuElement.addElement("engName");

engNameElement.setText(catNameEn);

Element chiNameElement = menuElement.addElement("chiName");

chiNameElement.setText(catName);

2.4、写入XML文件

注意文件操作的包装类是乱码的根

Java代码

publicstaticbooleandoc2XmlFile(Documentdocument,Stringfilename){

booleanflag=true;

try{

XMLWriterwriter=newXMLWriter(newOutputStreamWriter(newFileOutputStream(filename),"UTF-8"));

writer.write(document);

writer.close();

}catch(Exceptionex){

flag=false;

ex.printStackTrace();

}

System.out.println(flag);

returnflag;

}

Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码方法。调用OutputFormat. createPrettyPrint()方法可以获得一个默认的pretty print风格的格式对象。对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。

2. 5、遍历xml节点

对Document对象调用getRootElement()方法可以返回代表根节点的Element对象。拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得它的子节点的Element对象们的一个迭代器。使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。

2.6、创建xml文件

public static void main(String args[]){

String fileName="c:/text.xml";

Document document=DocumentHelper.createDocument();//建立document对象,用来操作xml文件

Element booksElement=document.addElement("books");//建立根节点

booksElement.addComment("This is a test for dom4j ");//加入一行注释

Element bookElement=booksElement.addElement("book");//添加一个book节点

bookElement.addAttribute("show","yes");//添加属性内容

Element titleElement=bookElement.addElement("title");//添加文本节点

titleElement.setText("ajax in action");//添加文本内容

try{

XMLWriter writer=new XMLWriter(new FileWriter(new File(fileName)));

writer.write(document);

writer.close();

}catch(Exception e){

e.printStackTrace();

}

}

2.7、修改节点属性

publicstaticvoidmodifyXMLFile() {

String oldStr ="c:/text.xml";

String newStr ="c:/text1.xml";

Document document =null;

//修改节点的属性

try{

SAXReadersaxReader =newSAXReader();//用来读取xml文档

document = saxReader.read(newFile(oldStr));//读取xml文档

Listlist = document.selectNodes("/books/book/@show");//用xpath查找节点book的属性

Iteratoriter = list.iterator();

while(iter.hasNext()) {

Attribute attribute = (Attribute) iter.next();

if(attribute.getValue().equals("yes"))

attribute.setValue("no");

}

}catch(Exception e) {

e.printStackTrace();

}

//修改节点的内容

try{

SAXReadersaxReader =newSAXReader();//用来读取xml文档

document = saxReader.read(newFile(oldStr));//读取xml文档

Listlist = document.selectNodes("/books/book/title");//用xpath查找节点book的内容

Iteratoriter = list.iterator();

while(iter.hasNext()) {

Element element = (Element) iter.next();

element.setText("xxx");//设置相应的内容

}

}catch(Exception e) {

e.printStackTrace();

}

try{

XMLWriter writer =newXMLWriter(newFileWriter(newFile(newStr)));

writer.write(document);

writer.close();

}catch(Exception ex) {

ex.printStackTrace();

}

}

2.8、删除节点

publicstaticvoidremoveNode() {

String oldStr ="c:/text.xml";

String newStr ="c:/text1.xml";

Document document =null;

try{

SAXReader saxReader =newSAXReader();//用来读取xml文档

document = saxReader.read(newFile(oldStr));//读取xml文档

Listlist = document.selectNodes("/books/book");//用xpath查找对象

Iteratoriter = list.iterator();

while(iter.hasNext()) {

Element bookElement = (Element) iter.next();

//创建迭代器,用来查找要删除的节点,迭代器相当于指针,指向book下所有的title节点

Iteratoriterator = bookElement.elementIterator("title");

while(iterator.hasNext()) {

Element titleElement = (Element) iterator.next();

if(titleElement.getText().equals("ajax in action")) {

bookElement.remove(titleElement);

}

}

}

}catch(Exception e) {

e.printStackTrace();

}

try{

XMLWriter writer =newXMLWriter(newFileWriter(newFile(newStr)));

writer.write(document);

writer.close();

}catch(Exception ex) {

ex.printStackTrace();

}

}

2、XML文档操作2

2.1、Document对象相关

1、读取XML文件,获得document对象.

SAXReaderreader=newSAXReader();

Documentdocument=reader.read(newFile("input.xml"));

2、解析XML形式的文本,得到document对象.

Stringtext="<members></members>";

Documentdocument=DocumentHelper.parseText(text);

3、主动创建document对象.

Documentdocument=DocumentHelper.createDocument();

Elementroot=document.addElement("members");//创建根节点

2.2、节点相关

1、获取文档的根节点.

ElementrootElm=document.getRootElement();

2、取得某节点的单个子节点.

ElementmemberElm=root.element("member");//"member"是节点名

3.取得节点的文字

String text=memberElm.getText();

String text=root.elementText("name");这个是取得根节点下的name字节点的文字.

4.取得某节点下指定名称的所有节点并进行遍历.

Java代码

Listnodes=rootElm.elements("member");

for(Iteratorit=nodes.iterator();it.hasNext();){

Elementelm=(Element)it.next();

//dosomething

}

5.对某节点下的所有子节点进行遍历.

Java代码

for(Iteratorit=root.elementIterator();it.hasNext();){

Elementelement=(Element)it.next();

//dosomething

}

6.在某节点下添加子节点.

ElementageElm=newMemberElm.addElement("age");

7.设置节点文字.

ageElm.setText("29");

8.删除某节点.

parentElm.remove(childElm);//childElm是待删除的节点,parentElm是其父节点

9.添加一个CDATA节点.

Element contentElm = infoElm.addElement("content");

contentElm.addCDATA(diary.getContent());

2.3、属性相关.

1.取得节点的指定的属性

Elementroot=document.getRootElement();

Attributeattribute=root.attribute("size");//属性名name

2.取得属性的文字

Stringtext=attribute.getText();

Stringtext2=root.element("name").attributeValue("firstname");

//这个是取得根节点下name字节点的firstname属性的值.

3.遍历某节点的所有属性

Elementroot=document.getRootElement();

for(Iteratorit=root.attributeIterator();it.hasNext();){

Attributeattribute=(Attribute)it.next();

Stringtext=attribute.getText();

System.out.println(text);

}

4.设置某节点的属性和文字.

newMemberElm.addAttribute("name","sitinspring");

5.设置属性的文字

Attributeattribute=root.attribute("name");

attribute.setText("sitinspring");

6.删除某属性

Attributeattribute=root.attribute("size");//属性名name

root.remove(attribute);

2.4、将文档写入XML文件.

1.文档中全为英文,不设置编码,直接写入.

XMLWriterwriter=newXMLWriter(newFileWriter("output.xml"));

writer.write(document);

writer.close();

2.文档中含有中文,设置编码格式再写入.

OutputFormatformat=OutputFormat.createPrettyPrint();

format.setEncoding("GBK");//指定XML编码

XMLWriterwriter=newXMLWriter(newFileWriter("output.xml"),format);

writer.write(document);

writer.close();

2.5、字符串与XML的转换

1.将字符串转化为XML

Stringtext="<members><member>sitinspring</member></members>";

Documentdocument=DocumentHelper.parseText(text);

2.将文档或节点的XML转化为字符串.

SAXReaderreader=newSAXReader();

Documentdocument=reader.read(newFile("input.xml"));

Elementroot=document.getRootElement();

StringdocXmlText=document.asXML();

StringrootXmlText=root.asXML();

ElementmemberElm=root.element("member");

StringmemberXmlText=memberElm.asXML();

3、dom4j的事件处理模型涉及的类和接口:

3.1、类:SAXReader

public voidaddHandler(String path,ElementHandler handler)

当解析到path指定的路径时,将调用参数handler指定的处理器。针对不同的节点可以添加多个handler实例。或者调用默认的Handler setDefaultHandler(ElementHandler handler);

3.2、接口ElementHandler

public voidonStart(ElementPath path)

该方法在解析到元素的开始标签时被调用。

public voidonEnd(ElementPath path)

该方法在解析到元素的结束标签时被调用

3.3、接口:ElementPath(假设有参数:ElementPath path)

public voidaddHandler(String path,ElementHandler)

该方法与SAXReader类中的addHandler()方法的作用相同。路径path可以是绝对路径(路径以/开头),也可以是相对路径(假设是当前路径的子节点路径)。

public voidremoveHandler(String path)

移除指定路径上的ElementHandler实例。路径可以是相对路径,也可以是绝对路径。

public StringgetPath()

该方法得到当前节点的路径。该方法返回的是完整的绝对路径

public ElementgetCurrent()

该方法得到当前节点。

3.3、Element类

3.4、类DocumentHelper

DocumentHelper是用来生成生成XML文档的工厂类

4、通过xpath查找指定的节点

采用xpath查找需要引入jaxen-xx-xx.jar,否则会报java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常。

List list=document.selectNodes("/books/book/@show");

4.1、xpath语法

1、选取节点

XPath使用路径表达式在XML文档中选取节点,节点是沿着路径或者step来选取的。

常见的路径表达式:

实例

2、谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

常见的谓语的一些路径表达式:

3、选取未知节点

XPath通配符可用来选取未知的XML元素。

实例

4、选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

5、XPath轴

轴可定义某个相对于当前节点的节点集。

6、路径

Ø位置路径表达式

位置路径可以是绝对的,也可以是相对的。

绝对路径起始于正斜杠( / ),而相对路径不会这样。在两种情况中,位置路径均包括一个或多个步,每个步均被斜杠分割:

Ø绝对位置路径:

/step/step/...

Ø相对位置路径:

step/step/...

每个步均根据当前节点集之中的节点来进行计算。

Ø步(step)包括:

轴(axis):定义所选节点与当前节点之间的树关系

节点测试(node-test):识别某个轴内部的节点

零个或者更多谓语(predicate):更深入地提炼所选的节点集

步的语法轴名称::节点测试[谓语]

实例

7、XPath运算符

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。