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;
    }
}

获取xml文件信息(重点看,我写的)

第一步,当然是把dom4j的jar包放好。
然后,我们写一个book.xml文件如下图,附上代码:
在这里插入图片描述

<?xml version="1.0" encoding="utf-8" ?>
<books>
    <book id="1">
        <name>三国演义</name>
        <price>100</price>
    </book>
    <book id="2">
        <name>水浒传</name>
        <price>99</price>
    </book>
</books>

然后,我们写一个Book.java类(本例子其实也可以不写该类)

package com.hstc.lcw;

public class Book {
    private Integer id;
    private String name;
    private Double price;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Book() {
    }

    public Book(Integer id, String name, Double price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

再写一个Main.java类

package com.hstc.lcw;

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

import java.util.List;
public class Main {
    public static void main(String[] args){
        //读取xml文件
        try {
            SAXReader saxReader = new SAXReader();
            Document document = saxReader.read("01-xml/xml/books.xml");
            //获取root元素
            Element root = document.getRootElement();
            //获取root元素下的所有book元素,如果只要一个,那么用方法element
            List<Element> books = root.elements("book");
            System.out.println("输出每一个book标签");
            //遍历搜索到的root下所有的book标签
            for (Element item : books){
            	//把标签转化为string格式输出查看
                System.out.println(item.asXML());
                //输出每个book标签的name标签
                Element nameElement = item.element("name");
                System.out.println("name标签为:"+nameElement.asXML());
                //输出每个name标签里面的内容
                String nameText = nameElement.getText();
                System.out.println("name标签的内容为:"+nameText);

                //也可以使用Element对象的elementText方法直接获取
                String priceText = item.elementText("price");
                System.out.println("price标签的内容为:"+priceText);
                //使用Element对象的attributeValue方法获取book标签的属性值
                String idText = item.attributeValue("id");
                System.out.println("id值为:"+ idText);

                //将数据存入Book对象
                System.out.println("以字符串形式输出:");
                Book book = new Book(Integer.parseInt(idText),nameText,Double.parseDouble(priceText));
                //以string形式输出
                System.out.println(book);
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

运行结果如下(着重看其中遍历的一个结果即可,已用红色方框框起来):
在这里插入图片描述

以下是官方给出的使用方法

迭代器

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;
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值