使用Dom4j解析xml

1. xml

概念Extensible Markup Language 可扩展标记语言

可扩展:标签都是自定义的。

功能

存储数据
​ 1. 配置文件
​ 2. 在网络中传输

xml与html的区别

  1. xml标签都是自定义的,html标签是预定义。
  2. xml的语法严格,html语法松散
  3. xml是存储数据的,html是展示数据

基本语法:

  1. xml文档的后缀名 .xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须使用引号(单双都可)引起来
  5. 标签必须正确关闭
  6. xml标签名称区分大小写

简单实例

<?xml version='1.0' ?>
<users>
    <user id='1'>
        <name>zhangsan</name>
        <age>23</age>
        <gender>male</gender>
        <br/>
    </user>

    <user id='2'>
        <name>lisi</name>
        <age>24</age>
        <gender>female</gender>
    </user>
</users>

组成部分:

  1. 文档声明
    1. 格式:
    2. 属性列表:
* version:版本号,必须的属性
* encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
* standalone:是否独立
  * 取值:
    * yes:不依赖其他文件
    * no:依赖其他文件
  1. 标签:标签名称自定义的
  • 规则:
    • 名称可以包含字母、数字以及其他的字符
    • 名称不能以数字或者标点符号开始
    • 名称不能以字母 xml(或者 XML、Xml 等等)开始
    • 名称不能包含空格
  1. 属性:
    id属性值唯一
  2. 文本:
  • CDATA区:在该区域中的数据会被原样展示
    • 格式:

2. xml解析与写入

xml常见的解析器:

	1. JAXP:sun公司提供的解析器,支持dom和sax两种思想
	2. DOM4J:一款非常优秀的解析器
	3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
	4. PULL:Android操作系统内置的解析器,sax方式的。

使用dom4j解析xml

xml文件如下

<?xml version='1.0' ?>
<users error="none" code="success">
    <user id='1'>
        <name>zhangsan</name>
        <age>23</age>
        <gender>male</gender>
        <br/>
    </user>

    <user id='2'>
        <name>lisi</name>
        <age>24</age>
        <gender>female</gender>
    </user>
</users>

解析xml

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

import java.io.File;
import java.util.List;

public class XmlDemo {
    public static void main(String[] args) throws DocumentException {
        //获取文档对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("user.xml"));
        //获取根元素
        Element root = doc.getRootElement();
        System.out.println("获取到的根元素" + root);
        //获取所有的子元素Love
        List<Element> users = root.elements("user");
        //输入name元素的内容
        for (Element element : users) {
            System.out.println("获取id属性:" + element.attribute("id").getValue());
            System.out.println("获取name:" + element.elementTextTrim("name"));
            System.out.println("获取age:" + element.elementTextTrim("age"));
            System.out.println("获取gender:" + element.elementTextTrim("gender"));
            System.out.println("---------------");
        }
    }
}

使用XPath快速查找

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

import java.io.File;
import java.util.List;

public class XmlDemo {
    public static void main(String[] args) throws DocumentException {
        //获取文档对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("user.xml"));
        List<Node> list = doc.selectNodes("//user");
        for (Node node : list) {
            System.out.println(node.valueOf("name"));
        }

        System.out.println("------------");

        Node node = doc.selectSingleNode("//user");
        String id = node.valueOf("@id");
        System.out.println(id);

        System.out.println("------------");

        Node node2 = doc.selectSingleNode("//user[@id='2']");
        String name = node.valueOf("name");
        System.out.println(name);
    }
}


创建一个新的XML文档并写入本地

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

import java.io.FileOutputStream;
import java.io.IOException;

public class XmlDemo {
    public static void main(String[] args) throws IOException {
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("root");

        Element author1 = root.addElement("author")
                .addAttribute("name", "James")
                .addAttribute("location", "UK")
                .addText("James Strachan");

        Element author2 = root.addElement("author")
                .addAttribute("name", "Bob")
                .addAttribute("location", "US")
                .addText("Bob McWhirter");
        //设置写入xml为格式化的xml
        OutputFormat format = OutputFormat.createPrettyPrint();
        //设置写入的xml为压缩的xml
        //OutputFormat format = OutputFormat.createCompactFormat();
        XMLWriter writer = new XMLWriter(new FileOutputStream("new.xml"), format);
        writer.write(document);
        writer.close();
    }
}

遍历迭代xml

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

import java.io.File;
import java.io.IOException;
import java.util.Iterator;

public class XmlDemo {
    public static void main(String[] args) throws DocumentException {
        //获取文档对象
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("user.xml"));
        Element root = document.getRootElement();
        // iterate through child elements of root
        for (Iterator<Element> it = root.elementIterator(); it.hasNext(); ) {
            Element element = it.next();
            // do something
            System.out.println(element.elementTextTrim("name"));
        }

        System.out.println("----------------");

        // iterate through child elements of root with element name "foo"
        for (Iterator<Element> it = root.elementIterator("user"); it.hasNext(); ) {
            Element user = it.next();
            System.out.println(user.elementTextTrim("age"));
        }

        System.out.println("----------------");

        // iterate through attributes of root
        for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext(); ) {
            Attribute attribute = it.next();
            // do something
            System.out.println(attribute.getValue());
        }
    }
}

原文地址:https://www.cnblogs.com/ifme/p/12402570.html