欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java解析XML

程序员文章站 2022-06-17 08:34:50
...

XML解析方式

(1)DOM解析:解析器把**整个**XML文件加载到内存,并生成一个Document对象。

优点:元素与元素之前保持依赖管理,可以对其进行CRUD操作。

缺点:当XML文件过大时,可能会出现内存溢出问题。

(2)SAX解析:一种速度更快、更有效的方法。它逐行扫描文档,一边扫描一边解析。基于事件驱动进行具体解析,每执行一行,都将触发对应的事件。

优点:处理速度很快,可以处理大文件。

缺点:只能读,逐行后会释放资源

(3)PULL解析: Android内置的XML解析方式,类似于SAX。

XML解析器

根据不同的解析方式提供了具体的实现,称为解析器。为了简化解析器的操作,各大公司提供了易于操作的解析开发包

  • JAXP: SUN公司提供支持DOM和SAX的开发包

  • jsoup: 一种处理HTML特定解析开发包

  • dom4j: 较为常用的解析开发包,Hibernate底层所使用的

  • JDom: dom4j兄弟

DOM解析原理

XML DOM将整个XML文档加载到内存中,生成一颗DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。若XML文件如下:

<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="2.5">
    <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>jit.wxs.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>

经过DOM解析后,生成了一棵树:

Java解析XML

dom4j

这里以dom4j为例,讲解代码实现。

(1)导入jar包

Java解析XML

(2)API

dom4j必须使用核心类SaxReader加载xml文档获得Document,通过Document对象获得文档的根元素,然后就可以操作了。

SaxReader对象:

  • read(…) 加载执行xml文档

Document对象:

  • getRootElement() 获得根元素

Element对象:

  • elements(…) 获得指定名称的所有子元素,可以不指定名称

  • element(…) 获得指定名称的第一个子元素,可以不指定名称

  • getName() 获得当前元素的元素名

  • attributeValue() 获得指定属性名的属性值

  • elementText(…) 获得指定名称子元素的文本值

  • getText() 获得当前元素的文本内容

(3)示例代码

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 Main {

    public static void main(String[] args) throws DocumentException {
        // 1. 获得Document对象
        SAXReader saxReader = new SAXReader();
        Document doc = saxReader.read(new File("src/web.xml"));

        // 2. 获得根元素
        Element rootElement = doc.getRootElement();

        // 获取version属性值
        String version = rootElement.attributeValue("version");
        System.out.println("version: " + version);

        printElement(rootElement);
    }

    // 递归遍历DOM树
    private static void printElement(Element root) {
        // 3. 获得所有子元素
        List<Element> lists = root.elements();

        // 4. 遍历所有
        for (Element element: lists ) {
            String name = element.getName();
            System.out.println("进入结点:" + name);

            if(element.elements().size() == 0) {
                String text = element.getText();
                System.out.println(name + "内容为:" + text);
            } else {
                printElement(element);
            }
        }
    }
}
version: 2.5
进入结点:servlet
进入结点:servlet-name
servlet-name内容为:helloServlet
进入结点:servlet-class
servlet-class内容为:jit.wxs.HelloServlet
进入结点:servlet-mapping
进入结点:servlet-name
servlet-name内容为:helloServlet
进入结点:url-pattern
url-pattern内容为:/hello
相关标签: xml java dom4j

上一篇: java解析XML文件

下一篇: 第三天