c语言编程笔录

您现在的位置是:首页 > 编程 > 编程经验

编程经验

四种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解析通过选择路径表达式定位节点,提供了精确和灵活的选择和过滤机制。

文章评论