您的位置:首页 > 其它

dom4j 处理 XML

2014-07-18 23:07 141 查看

1-Dom4j:

    DOM4J 是 dom4j.org 出品的一个开源 XML 解析包,Dom4j 是一个易用的、开源的库,用于 XML,

XPath 和 XSLT。它应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。

    dom4j 是一个 Java 的 XML API,类似于 jdom,用来读写 XML 文件的。dom4j 是一个非常非常优秀

的 JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软

件,可以在 SourceForge 上找到它。在 IBM developerWorks 上面可以找到一篇文章,对主流的 Java XML

API 进行的性能、功能和易用性的评测,dom4j 无论在哪个方面都是非常出色的。如今你可以看到越

来越多的 Java 软件都在使用 dom4j 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 dom4j。这

是必须使用的 jar 包, Hibernate 用它来读写配置文件。

2-解析 XML:

    提供接口及解析机制:

  


    dom4j 对底层原始的 XML 解析器进行了高度封装,正是这种封装简化了 XML 处理。在 dom4j 的

   

     org.dom4j.io 包下提供了如下几个类:

DOMReader:它负责根据 W3C 的 DOM 树创建 dom4j 树。
SAXReader:它基于 SAX 解析机制来解析 XML 文档,并将其转换为 dom4j 树。
XPP3Reader:其底层需要依赖于 XML Pull Parser 3.x 来解析 XML 文档,并将其转换为 dom4j

树。
XPPReader:它是基于 XML Pull Parser 2.x 的解析器,目前不支持注释、DCATA 和处理指令。
3-读取 XML:

      示例xml:

<?xml version="1.0" encoding="UTF-8"?>

<persons>
<person>
<name>李三</name>
<weixin>lisan_ww</weixin>
</person>
<person>
<name>张四</name>
</person>
<person>
<name>zhangsi_yy</name>
</person>
</persons>
     根据 dom4j 底层提供的不同的 XML 解析器,可以有以下几种方式读取 XML 文档:

     1) SAXReader 解析器方式:

     public class Test {
@org.junit.Test
public void Test() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("04_jaxp/person.xml"));
}
}

    2) XPP3Reader 解析器方式:

<span style="font-size:18px;">public class Test {
@org.junit.Test
public void Test() throws Exception {
XPP3Reader reader = new XPP3Reader();
Document document = reader.read(new File("04_jaxp/person.xml"));
}
}</span>


   3)XPPReader 解析器方式:

public class Test1 {
@org.junit.Test
public void Test() throws Exception {
XPPReader reader = new XPPReader();
Document document = reader.read(new File("04_jaxp/person.xml"));
}
}
4-解析 XML

通过解析器读取 XML 文档完成后,使用 dom4j 解析 XML 文档:

1) 通过 Document 对象的 getRootElement()方法获取根元素;

2) 通过 Element 对象的 elements()方法获取根元素的所有子元素;

3) 遍历所有子元素,得到解析后的内容。

public class Test {
private static void iterDocument(Document document) {
//获取XML文档的根元素
Element rootElement = document.getRootElement();
//获取根元素下的所有子元素
List<Element> elements = rootElement.elements();
//遍历所有子元素集合
for (Element element : elements) {
//获取元素名称
String eleName = element.getName();
//获取name子元素的文本内容
String name = element.elementText("name");
//获取qq子元素的文本内容
String qq = element.elementText("qq");
//获取weixin子元素的文本内容
String weixin = element.elementText("weixin");
System.out.println(eleName + ": [name = " + name + ", qq = " +
qq + ", weixin = " + weixin + "]");
}
}
}


5- 修改 XML

通过 dom4j 修改 XML 文档需要如下几步:

1) 读取 XML 文档,得到 Document 对象及根元素;

2) 对解析得到的 XML 文档做修改、增加及删除操作;

3) 将修改后的内容,回写到当前 XML 文档中。

public class Test {
private void updateDocument(Document document) throws Exception {
//获取XML文档的根元素
Element rootElement = document.getRootElement();
//获取根元素下的所有子元素
List<Element> elements = rootElement.elements();
/***************修改元素****************/
//获取根元素下第一个person元素
Element firElement = elements.get(0);
//获取person元素下blog元素
Element blog = firElement.element("blog");
//修改blog元素的文本内容
blog.setText("http://blog.csdn.net/longestory");
/***************增加元素****************/
//为XML文档的根元素,增加新的子元素person
Element newElement = rootElement.addElement("person");
//为新增加的子元素,设置属性
newElement.addAttribute("number", "003");
//为新增加的子元素,添加一个name子元素,文本内容为longestory
newElement.addElement("name").setText("longestory");
/***************删除元素****************/
//获取根元素下第二个person元素
Element secElement = elements.get(1);
//获取第二个person元素下,需要删除的元素
Element delElement = secElement.element("blog");
//删除第二个person元素下的blog元素
secElement.remove(delElement);
/***************回写XML****************/
//创建格式化器,使用\t缩进,添加换行
OutputFormat format = new OutputFormat("\t", true);
//清空数据中原有的换行
format.setTrimText(true);
//创建XML输出流对象
XMLWriter writer = new XMLWriter(new
FileOutputStream("04_jaxp/person.xml"));
//输出Document
writer.write(document);
//关闭输出流
writer.close();
}
}

6-创建 XML

dom4j 还提供了创建 XML 文档的方法:
Document document = DocumentHelper.createDocument();


7- 常用 API简介

Node 下方法:
 String asXML():把当前节点转换成字符串,如果当前 Node 是 Document,那么就会把整个 XML

           文档返回;

 String getName():获取当前节点名字;Document 的名字就是绑定的 XML 文档的路径;Element

           的名字就是元素名称;Attribute 的名字就是属性名;

 Document getDocument():返回当前节点所在的 Document 对象;

 short getNodeType():获取当前节点的类型;

 String getNodeTypeName():获取当前节点的类型名称,例如当前节点是 Document 的话,那

          么该方法返回 Document;

 String getStringValue():获取当前节点的子孙节点中所有文本内容连接成的字符串;

 String getText():获取当前节点的文本内容。如果当前节点是 Text 等文本节点,那么本方法返

          回文本内容;例如当前节点是 Element,那么当前节点的内容不是子元素,而是纯文本内容,

         那么返回文本内容,否则返回空字符串;

 void setDocument(Document doc):给当前节点设置文档元素;

 void setParent(Element parent):给当前节点设置父元素;

 void setText(String text):给当前节点设置文本内容

Branch 下方法

       void add(Element e):添加子元素;

       void add(Node node):添加子节点;

       void add(Comment comment):添加注释;

       Element addElement(String eleName):通过名字添加子元素,返回值为子元素对象;

       void clearContent():清空所有子内容;

       List content():获取所有子内容,与获取所有子元素的区别是,<name>liSi</name>元素没有子

               元素,但有子内容;

       Element elementById(String id):如果元素有名为“ID”的属性,那么可以使用这个方法来查找;

       int indexOf(Node node):查找子节点在子节点列表中的下标位置;

       Node node(int index):通过下标获取子节点;

       int nodeCount():获取子节点的个数;

       Iterator nodeIterator():获取子节点列表的迭代器对象;

       boolean remove(Node node):移除指定子节点;

       boolean remove(Commont commont):移除指定注释;

       boolean remove(Element e):移除指定子元素;

       void setContent(List content)  :设置子节点内容;

Document 方法:          

              Element getRootElement():获取根元素;

          void setRootElement():设置根元素;

          String getXmlEncoding():获取 XML 文档的编码;

          void setXmlEncoding():设置 XML 文档的编码;

 Element 方法:
 void add(Attribute attr):添加属性节点;

 void add(CDATA cdata):添加 CDATA 段节点;

 void add(Text Text):添加 Text 节点;

 Element addAttribute(String name, String value):添加属性,返回值为当前元素本身;

 Element addCDATA(String cdata):添加 CDATA 段节点

    Element addComment(String comment):添加属性节点;

 Element addText(String text):添加 Text 节点;

 void appendAttributes(Element e):把参数元素 e 的所有属性添加到当前元素中;

 Attribute attribute(int index):获取指定下标位置上的属性对象;

 Attribute attribute(String name):通过指定属性名称获取属性对象;

 int attributeCount():获取属性个数;

 Iterator attributeIterator():获取当前元素属性集合的迭代器;

 List attributes():获取当前元素的属性集合;

 String attributeValue(String name):获取当前元素指定名称的属性值;

 Element createCopy():clone 当前元素对象,但不会 copy 父元素。也就是说新元素没有父元

素,但有子元素;

 Element element(String name):获取当前元素第一个名称为 name 的子元素;

 Iterator elementIterator():获取当前元素的子元素集合的迭代器;

 Iterator elementIterator(String name):获取当前元素中指定名称的子元素集合的迭代器;

 List elements():获取当前元素子元素集合;

 List elements(String name):获取当前元素指定名称的子元素集合;

 String elementText(String name):获取当前元素指定名称的第一个元素文件内容;

 String elementTextTrime(String name):同上,只是去除了无用空白;

 boolean isTextOnly():当前元素是否为纯文本内容元素;

 boolean remove(Attribute attr):移除属性;

 boolean remove(CDATA cdata):移除 CDATA;

 boolean remove(Text text):移除 Text。

DocumentHelper 静态方法:

             static Document createDocument():创建 Dcoument 对象;

         static Element createElement(String name):创建指定名称的元素对象;

         static Attribute createAttrbute(Element owner, String name, String value):创建属性对象;

         static Text createText(String text):创建属性对象;

         static Document parseText(String text):通过给定的字符串生成 Document 对象;




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