dom4j api 详解

友情链接
友情链接
友情链接

要使用dom4j读写XML文档,需要先下载dom4j包,目前最新dom4j包地址:
http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip

DOM4J简介

DOM4J 是 dom4j.org 出品的一个开源 XML 解析包。
DOM4J 应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。
Dom4J 把整个文档作为一个对象。
Dom4J 最大的特使就是使用了大量的接口,它的主要接口都在org.dom4j里面定义。

元素含义

元素含义
Attribute定义了 XML 的属性。
Branch指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为
CDATA定义了 XML CDATA 区域
CharacterData是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text.
Comment定义了 XML 注释的行为
Document定义了XML 文档
DocumentType定义 XML DOCTYPE 声明
Element定义XML 元素
ElementHandler定义了Element 对象的处理器
ElementPath被 ElementHandler 使用,用于取得当前正在处理的路径层次信息
Entity定义 XML entity
Node为dom4j中所有的XML节点定义了多态行为
NodeFilter定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate)
ProcessingInstruction定义 XML 处理指令
Text定义 XML 文本节点
Visitor用于实现 Visitor模式
XPath在分析一个字符串后会提供一个 XPath 表达式

Element类

getQName()元素的QName对象
getNamespace()元素所属的Namespace对象
getNamespacePrefix()元素所属的Namespace对象的prefix
getNamespaceURI()元素所属的Namespace对象的URI
getName()元素的local name
getQualifiedName()元素的qualified name
getText()元素所含有的text内容,如果内容为空则返回一个空字符串而不是null
getTextTrim()元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null
attributeIterator()元素属性的iterator,其中每个元素都是

Attribute对象

attributeValue()元素的某个指定属性所含的值
elementIterator()元素的子元素的iterator,其中每个元素都是Element对象
element()元素的某个指定(qualified name或者local name)的子元素
elementText()元素的某个指定(qualified name或者local name)的子元素中的text信息
getParent()元素的父元素
getPath()元素的XPath表达式,其中父元素的qualified name和子元素的qualified name之间使用”/”分隔
isTextOnly()是否该元素只含有text或是空元素
isRootElement()是否该元素是XML树的根节点

XML文档操作

document对象相关:

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

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

SAXReader reader = new SAXReader();
Document  document = reader.read(new File("input.xml"));

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

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

String text = "<members></members>";
Document document = DocumentHelper.parseText(text);

节点相关

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

Element root = dom.getRootElement();

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

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

3.获取节点文字

String text=memberElm.getText();

4.取得某节点下名为”member”的所有字节点并进行遍历

List list = rootElm.elements("member");

for (Iterator it = list.iterator(); it.hasNext();) {
   Element elm = (Element) it.next();
   // do something
}

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

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

Iterator it = root.elementIterator();
//Iterator it = root.elements().iterator(); 
while (it.hasNext()) {   
    Element element = (Element) it.next();
    // do something
}

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

Element ageElm = newMemberElm.addElement("age");

7.设置节点文字.

ageElm.setText("29");

8.删除某节点.

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

属性相关

1.取得某节点下的某属性

    Element root=document.getRootElement();    
    Attribute attribute=root.attribute("size");

2.取得属性的文字

String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname"); 
//这个是取得根节点下name子节点的属性firstname的值.

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

Element root=document.getRootElement();    
for(Iterator it=root.attributeIterator();it.hasNext();){
        Attribute attribute = (Attribute) it.next();
        String text=attribute.getText();
        System.out.println(text);
    }

示例文档 demo.xml

<?xml version="1.0" encoding="UTF-8"?>
<configs>
    <config name="version" value="latest"/>
    <config name="year" value="20014" />
</configs>

java代码

SAXReader saxReader = new SAXReader();
Document document = saxReader.read(baseUrl);
// 获取根节点
Element rootElement = document.getRootElement();
// 获取指定节点的集合
List<Element> configlist = rootElement.selectNodes("config");
for (Element element : configlist) {
    Map map = new HashMap();
    String name = element.attribute("name").getStringValue();
    String value = element.attribute("value").getStringValue();
    map.put(name, value);
    //doSomething   
}    

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

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

5.设置属性的文字

Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");

6.删除某属性

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

将文档写入XML文件

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

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

XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();

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

// OutputFormat format = OutputFormat.createCompactFormat();
//去除空格回车换行,适合运行期间
OutputFormat format = OutputFormat.createPrettyPrint();
//漂亮的格式 默认编码是UTF-8
format.setEncoding("GBK");    // 指定XML编码        
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);

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

字符串与XML的转换

1.将字符串转化为XML

String text = "<members><member>sitinspring</member></members>";
Document document = DocumentHelper.parseText(text);

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

SAXReader reader = new SAXReader();
Document  document = reader.read(new File("input.xml"));            
Element root=document.getRootElement();                
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();

注意:asXML()字节码默认为UTF-8;

使用 XPath 快速找到节点.

读取的 XML 文档示例

<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
  <name>MemberManagement</name>
  <comment></comment>
  <projects>
    <project>PRJ1</project>
    <project>PRJ2</project>
    <project>PRJ3</project>
    <project>PRJ4</project>
  </projects>
  <buildSpec>
    <buildCommand>
      <name>org.eclipse.jdt.core.javabuilder</name>
      <arguments>
      </arguments>
    </buildCommand>
  </buildSpec>
  <natures>
    <nature>org.eclipse.jdt.core.javanature</nature>
  </natures>
</projectDescription>

使用XPath快速找到节点project

public static void main(String[] args){

    SAXReader reader = new SAXReader();

    try{
      Document  doc = reader.read(new File("sample.xml"));

      List  projects=doc.selectNodes("/projectDescription/projects/project"); // 以"/" 开头

      Iterator it=projects.iterator();

      while(it.hasNext()){
        Element elm=(Element)it.next();       
        System.out.println(elm.getText());
      }
    }
    catch(Exception ex){
       ex.printStackTrace();
    }
}

示例一:创建xml文档并输出到文件

import java.io.File;
import java.io.FileOutputStream;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;


public class Demo {
    public static void main(String[] args) throws Exception {
        Document doc = DocumentHelper.createDocument();
        //增加根节点
        Element books = doc.addElement("books");
        //增加子元素
        Element book1 = books.addElement("book");
        Element title1 = book1.addElement("title");
        Element author1 = book1.addElement("author");

        Element book2 = books.addElement("book");
        Element title2 = book2.addElement("title");
        Element author2 = book2.addElement("author");

        //为子节点添加属性
        book1.addAttribute("id", "001");
        //为元素添加内容
        title1.setText("Harry Potter");
        author1.setText("J K. Rowling");

        book2.addAttribute("id", "002");
        title2.setText("Learning XML");
        author2.setText("Erik T. Ray");

        //实例化输出格式对象
        OutputFormat format = OutputFormat.createPrettyPrint();
        //设置输出编码
        format.setEncoding("UTF-8");
        //创建需要写入的File对象
        File file = new File("D:" + File.separator + "books.xml");
        //生成XMLWriter对象,构造函数中的参数为需要输出的文件流和格式
        XMLWriter writer = new XMLWriter(new FileOutputStream(file), format);
        //开始写入,write方法中包含上面创建的Document对象
        writer.write(doc);
    }
}

运行结果
这里写图片描述

示例二:修改某个元素节点的主体内容:<售价>10元—20

public void test3()throws Exception{
    SAXReader reader = new SAXReader();
    Document document = reader.read("src/book.xml");
    //首先要得到根元素
    Element root = document.getRootElement();
    //得售价
    Element priceElement = root.element("书").element("售价");
    priceElement.setText("21元");
    //写回XML文档

    OutputFormat format = OutputFormat.createPrettyPrint();
    XMLWriter writer = new XMLWriter(new FileOutputStream("src/book.xml"), format);
    writer.write(document);
    writer.close();
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值