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可以使用上一章节我们用过的。
publicstaticvoidmain(String[] args) { StringxmlPath="./tool-jdk8/src/main/java/com/liuyc/tooljdk/xml/persons.xml"; try { // 1、创建解析器工厂,创建解析器SAXParsersaxParser=SAXParserFactory.newInstance().newSAXParser(); // 2、执行解析转换操作saxParser.parse(newFile(xmlPath), newCustomHandler()); } catch (ParserConfigurationExceptione) { thrownewRuntimeException(e); } catch (SAXExceptione) { thrownewRuntimeException(e); } catch (IOExceptione) { thrownewRuntimeException(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 () 文档解析结束后调用,该方法只会调用一次(可以省略)
classCustomHandlerextendsDefaultHandler { publicvoidstartElement(Stringuri, StringlocalName, StringqName, Attributesattributes) { // 拼接标签的属性if (attributes!=null&&attributes.getLength() >0) { Stringattrs=""; for (inti=0; i<attributes.getLength(); i++) { StringattrName=attributes.getQName(i); Stringvalue=attributes.getValue(i); attrs+=" "+attrName+"=\""+value+"\""; } System.out.print("<"+qName+attrs+">"); } // 标签没有属性,直接输出else { System.out.print("<"+qName+">"); } } publicvoidendElement(Stringuri, StringlocalName, StringqName) { System.out.print("</"+qName+">"); } publicvoidcharacters(char[] ch, intstart, intlength) { System.out.print(newString(ch, start, length)); } }
2.3 解析结果
sax方式解析XML文档结束,打印如下结果。
<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。