dom4j 处理 XML



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 对象;



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值