四种XML解析方式详解
李成白 2023-07-10编程经验
1.DOM解析DOM(DocumentObjectModel)解析是使用最常见的XML解析方式之一。它将整个XML文档加载到内存中,形成一个树状结构,其中每个节点代表一个XML元素,包括元素的标签、属
1. DOM解析
DOM(Document Object Model)解析是使用最常见的XML解析方式之一。它将整个XML文档加载到内存中,形成一个树状结构,其中每个节点代表一个XML元素,包括元素的标签、属性、文本内容等。通过操作这个树状结构,可以获取和修改XML文档的各个部分。
// 创建XMLHttpRequest对象 var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState === 4 && this.status === 200) { // 解析XML文档 var xmlDoc = xhttp.responseXML; // 获取根节点 var root = xmlDoc.documentElement; // 获取子节点 var elements = root.getElementsByTagName("element"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; // 获取元素属性 var attr = element.getAttribute("attr"); console.log(attr); // 获取元素文本内容 var text = element.firstChild.nodeValue; console.log(text); } } }; xhttp.open("GET", "example.xml", true); xhttp.send();
2. SAX解析
SAX(Simple API for XML)解析是一种基于事件驱动的XML解析方式。它逐行读取XML文档并触发相应的事件,应用程序通过注册事件处理函数来处理这些事件,从而获取XML文档的内容。相比DOM解析,SAX解析在内存占用上更低,适用于处理大型XML文档。
public class MyHandler extends DefaultHandler { private StringBuilder data; public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (qName.equalsIgnoreCase("element")) { data = new StringBuilder(); String attr = attributes.getValue("attr"); System.out.println(attr); } } public void characters(char[] ch, int start, int length) throws SAXException { data.append(new String(ch, start, length)); } public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("element")) { String text = data.toString().trim(); System.out.println(text); } } } SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); saxParser.parse("example.xml", new MyHandler());
3. StAX解析
StAX(Streaming API for XML)解析是一种可读写的XML解析方式,允许应用程序在解析XML文档的同时生成或修改XML内容。它通过游标进行遍历,应用程序可以选择在需要的时候读取节点,以及将新的节点添加到文档中去。
XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader reader = factory.createXMLStreamReader(new FileInputStream("example.xml")); while (reader.hasNext()) { int event = reader.next(); if (event == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equalsIgnoreCase("element")) { String attr = reader.getAttributeValue(null, "attr"); System.out.println(attr); } else if (event == XMLStreamConstants.CHARACTERS && !reader.isWhiteSpace()) { String text = reader.getText().trim(); System.out.println(text); } } reader.close();
4. XPath解析
XPath解析是通过路径选择表达式来定位XML节点的解析方式。它提供了一种简单直观的方式来遍历和查询XML文档,通过一些关键字和操作符,可以精确地选择和过滤节点,以及提取节点的属性或文本内容。
var xmlDoc = new DOMParser().parseFromString(xmlString, "text/xml"); var xpathResult = xmlDoc.evaluate("//element", xmlDoc, null, XPathResult.ANY_TYPE, null); var node = xpathResult.iterateNext(); while (node) { var attr = node.getAttribute("attr"); console.log(attr); var text = node.firstChild.nodeValue; console.log(text); node = xpathResult.iterateNext(); }
总结
XML解析是处理XML文档的重要环节,DOM解析适用于小型文档,提供了完整的树状结构,但消耗内存较多;SAX解析适用于大型文档,通过事件驱动方式解析,内存消耗较低;StAX解析可读写XML内容,适用于生成、修改XML文档;XPath解析通过选择路径表达式定位节点,提供了精确和灵活的选择和过滤机制。
很赞哦! ()