技术经验|Java-Web基础之XML解析JAXP-Sax

2023-11-04 10:02:33 浏览数 (2)

1 XML介绍和解析方式

「XML解析介绍」

XML是标记型文档,js 使用 dom 解析标记型文档是根据 html 的层级结构,在内存中分配一个属性结构,把 html 的标签,属性和文本都封装成 document 对象、element 对象,属性对象、文本对象,node 节点对象。

「XML」解析技术

xml的解析技术:dom 和 sax。

DOM:Document Object Model,文档对象模型。这种方式是 W3C 推荐的处理XML 的一种方式。

SAX:Simple APl for XML。这种方式不是官方标准,属于开源社区 XML-DEV,几乎所有的 XML 解析器都支持它。

「XML-dom」

特点:封装在内存处理。

优点:方便实现增删改的操作。

缺点:如果文件过大,可导致内存溢出。

「XML-sax」

特点:事件驱动,从上到下,依次解析,边读取边解析。

优点:不会导致内存溢出。

缺点:不能实现增删改的操作。

2 JAXP-Sax解析

XML是一种通用的数据交换格式,它的平台无关,语言无关,系统无关,在不同的语言环境的解析方式都是一样的,只不过是实现的语法不同。

SAX解析方式会逐行地去扫描XML文档,当遇到标签时会触发解析处理器,采用事件处理的方式解析XML (Simple API for XML) ,不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

SAX解析可分四个步骤进行:

1、得到xml文件对应的资源,可以是xml的输入流,文件和uri

2、得到SAX解析工厂(SAXParserFactory)

3、由解析工厂生产一个SAX解析器(SAXParser)

4、传入输入流和handler给解析器,调用parse()解析

Sax解析的流程图如下:

2.1 创建实验类SaxParserXmlTest,创建xml文件

首先创建一个类SaxParserXmlTest.java,然后创建一个persons.xml,xml可以使用上一章节我们用过的。

代码语言:javascript复制
    public static void main(String[] args) {
        
        String xmlPath = "./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml";

        try {
            // 1、创建解析器工厂,创建解析器
            SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser();

            // 2、执行解析转换操作
            saxParser.parse(new File(xmlPath), new CustomHandler());

        } catch (ParserConfigurationException e) {
            throw new RuntimeException(e);
        } catch (SAXException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

2.2 编写CustomHandler继承DefaultHandler

该类是SAX解析的核心所在,我们要重写以下几个我们关心的方法。

1、startDocument () 文档解析开始时调用,该方法只会调用一次(可以省略)

2、startElement(String uri, String localName, String qName, Attributes attributes)

3、characters(char[] ch, int start, int length)

4、endElement(String uri, String localName, String qName)

5、endDocument () 文档解析结束后调用,该方法只会调用一次(可以省略)

代码语言:javascript复制
class CustomHandler extends DefaultHandler {

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) {
        // 拼接标签的属性
        if (attributes != null && attributes.getLength() > 0) {
            String attrs = "";
            for (int i = 0; i < attributes.getLength(); i  ) {
                String attrName = attributes.getQName(i);
                String value = attributes.getValue(i);
                attrs  = " "   attrName   "=""   value   """;
            }
            System.out.print("<"   qName   attrs   ">");
        }
        // 标签没有属性,直接输出
        else {
            System.out.print("<"   qName   ">");
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) {
        System.out.print("</"   qName   ">");
    }

    @Override
    public void characters(char[] ch, int start, int length) {
        System.out.print(new String(ch, start, length));
    }
}

2.3 解析结果

sax方式解析XML文档结束,打印如下结果。

代码语言:javascript复制
<persons>
	<person sid="001" uid="QS#123">
		<name>张小帅</name>
		<sex>男</sex>
		<age>28</age>
	</person>
	<person sid="002">
		<name>刘晓萌</name>
		<sex>女</sex>
		<age>21</age>
	</person>
	<person sid="003">
		<name>王老四</name>
		<sex>男</sex>
		<age>38</age>
	</person>
</persons>

2.4 总结

SAX解析XML具有解析速度快,占用内存少,对于Android等移动设备来说有巨大的优势,深入了解SAX的事件触发机制是掌握SAX解析的关键,掌握了SAX的事件触发就掌握了SAX解析XML。

0 人点赞