dom4j简单使用

文章目录

dom4j的简单使用

首先,向你的项目引入dom4j.js文件,这是必不可少的。
如果你还没有该js文件,可以直接到此处下载

解析XML

import java.net.URL;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

public class Foo {

    public Document parse(URL url) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(url);
        return document;
    }
}

迭代器

public void bar(Document document) throws DocumentException {

    Element root = document.getRootElement();

    // 遍历root的子元素
    for (Iterator<Element> it = root.elementIterator(); it.hasNext();) {
        Element element = it.next();
        // do something
    }

    // 通过foo遍历root的子元素
    for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
        Element foo = it.next();
        // do something
    }

    // 遍历root的所有参数
    for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) {
        Attribute attribute = it.next();
        // do something
    }
 }

XPath

XPath 表达式可以在树中的 Document 或 节点的任何地方(例如Attribute、 Element或 ProcessingInstruction)进行计算。这允许使用一行代码在整个文档中进行复杂的导航。

public void bar(Document document) {
    List<Node> list = document.selectNodes("//foo/bar");

    Node node = document.selectSingleNode("//foo/bar/author");

    String name = node.valueOf("@name");
}

如果你想在XHTML文档中找到所有超文本链接,那么大可以使用下面代码:

public void findLinks(Document document) throws DocumentException {

    List<Node> list = document.selectNodes("//a/@href");

    for (Iterator<Node> iter = list.iterator(); iter.hasNext();) {
        Attribute attribute = (Attribute) iter.next();
        String url = attribute.getValue();
    }
}

快速循环

如果你不得不遍历大型XML文档树,那么为了提高性能,建议使用快速循环方法,这样可以避免Iterator为每个循环创建对象的成本。例如

public void treeWalk(Document document) {
    treeWalk(document.getRootElement());
}

public void treeWalk(Element element) {
    for (int i = 0, size = element.nodeCount(); i < size; i++) {
        Node node = element.node(i);
        if (node instanceof Element) {
            treeWalk((Element) node);
        }
        else {
            // do something…
        }
    }
}

创建新的XML文件

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

public class Foo {

    public Document createDocument() {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("books");

        Element author1 = root.addElement("book")
            .addAttribute("name", "三国演义")
            .addAttribute("price", "100");

        Element author2 = root.addElement("book")
            .addAttribute("name", "西游记")
            .addAttribute("price", "100");

        return document;
    }
}

写入文件

将 Document(或任何Node)写入文件的一种快速简便的方法是通过write()方法。

FileWriter out = new FileWriter("book.xml");
document.write(out);
out.close();

如果您希望能够更改输出的格式,例如漂亮的打印或紧凑的格式,或者您希望能够使用Writer 对象或OutputStream对象作为目标,那么您可以使用XMLWriter类。

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

public class Foo {

    public void write(Document document) throws IOException {

        // 写到文件output.xml
        try (FileWriter fileWriter = new FileWriter("output.xml")) {
            XMLWriter writer = new XMLWriter(fileWriter);
            writer.write( document );
            writer.close();
        }


        // 将Document打印到系统(命令框)
        OutputFormat format = OutputFormat.createPrettyPrint();
        writer = new XMLWriter(System.out, format);
        writer.write( document );

        // 以紧凑型格式打印到系统(命令框)
        format = OutputFormat.createCompactFormat();
        writer = new XMLWriter(System.out, format);
        writer.write(document);
        writer.close();
    }
}

与字符串相互转换

将Document或任一Node转化为字符串,只需要使用Document对象的方法asXML:

//document是获取到的Document或者任一Node
String text = document.asXML();

如果要把XML格式的字符串转化为Document格式,那么可以使用DocumentHelper类方法parseText(text)。

String text = "<person> <name>James</name> </person>";
Document document = DocumentHelper.parseText(text);

使用XSLT进行转换

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;

import org.dom4j.Document;
import org.dom4j.io.DocumentResult;
import org.dom4j.io.DocumentSource;

public class Foo {

    public Document styleDocument(Document document, String stylesheet) throws Exception {

        // load the transformer using JAXP
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(new StreamSource(stylesheet));

        // now lets style the given document
        DocumentSource source = new DocumentSource(document);
        DocumentResult result = new DocumentResult();
        transformer.transform(source, result);

        // return the transformed document
        Document transformedDoc = result.getDocument();
        return transformedDoc;
    }
}
上一篇:用dom4j对xml文件的读取和添加学习


下一篇:XML_Dom4j_工厂模式_commons-io工具包_Base64