解析 XML 文档

将文档中的数据读取到内存中。

DOM 解析

DOM 解析原理:xml 解析器一次性把整个 xml 文档加载进内存,然后在内存中构建一颗 Document 的对象树,通过 Document 对象,得到树上的节点对象,通过节点对象访问(操作)到 xml 文档的内容

  • 优点:操作方便,可以对文档进行 CRUD 的所有操作
  • 缺点:占用内存,如果XML文件比较大,容易影响解析性能且可能会造成内存溢出

SAX 解析

逐行读取,基于事件驱动。SAX 的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。

  • 优点:内存消耗小,解析速度快,SAX解析器是对文档的解析过程是一种边解析边执行的过程
  • 缺点:只能读取,不能增删改;不能随机访问;必须实现事件处理程序

DOM4J 解析器

与利用 DOM、SAX 来解析 xml 相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得 DOM 基本概念,就可以通过 dom4j 的 api 文档 来解析 xml。dom4j 是一套开源的 api。

Step1 : 下载并导入 JAR 包

Step2:获取 document 对象

Document:文档对象,代表内存中的 DOM 树

Method Code
读取XML文件,获得document对象 SAXReader reader = new SAXReader();
Document document = reader.read(url);
String encoding = document.getXMLEncoding();
解析XML形式的文本,得到document对象 String text = “XML_String”;
Document document = DocumentHelper.parseText(text);
主动创建document对象. Document document = DocumentHelper.createDocument();
Element root = document.addElement(“members”);
root.addElement(“author”).addAttribute(“name”,“value”).addText(“text”);

Step3:节点对象操作

Element:节点元素对象

Method Code
获取文档的根节点 Element root = document.getRootElement();
获取某个节点的子节点 Element element = root.element(“student”); element.element(“name”);
获取节点的文字 String text = element.getText();
设置节点文字 element.setText(“text”);
取得某节点下相同名称的子节点 List nodes = root.elements(“member”);
在某节点下添加子节点 Element agetElement = element.addElement(“age”);
删除某节点 parentElement.remove(childElement);

Step4:节点对象属性操作

Attribute:节点元素的属性值对象

Method Code
取得某节点下的某属性 Attribute attribute = root.attribute(“size”);
获取某节点的所有属性 List attributes = root.attributes();
取得属性的文字 String text = attribute.getValue();
设置属性的文字 attribute.setValue(“text”);
设置节点属性和文字 element.addAttribute(“name”,“value”);
删除某属性 root.remove(attribute);

写入 XML 文档

将内存中的数据保存到 xml 文档中。持久化存储。

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

public class Foo {
    public void write(Document document) throws IOException {
        // lets write to a file
        FileWriter fileWriter = new FileWriter("output.xml"); 
        XMLWriter writer = new XMLWriter(fileWriter);
        writer.write( document );
        writer.close();
        // Pretty print the document to System.out
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("GBK");
        writer = new XMLWriter(System.out, format);
        writer.write( document );
        // Compact format to System.out
        format = OutputFormat.createCompactFormat();
        writer = new XMLWriter(System.out, format);
        writer.write(document);
        writer.close();
    }
}