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。