JS解析XML的实现代码

yizhihongxing

JS解析XML一般分为两个步骤:获取XML文档和解析XML文档。获取XML文档可以使用Ajax方式从服务器获取,也可以使用XMLHttpRequest对象主动发起请求。解析XML文档则可以使用DOM方式和SAX方式。DOM方式将XML文档转化为一棵树形结构,可以使用js的DOM操作方法访问XML文档中的各个元素和属性,非常方便。SAX方式则逐行读取XML文档,遇到元素或属性时触发事件,适合于处理大型XML文件或需要忽略部分信息的情况。

下面以获取XML文档并使用DOM方式解析XML文档为例,详细讲解一下JS解析XML的实现代码。

步骤一:获取XML文档

Ajax方式

使用Ajax方式获取XML文档需要兼容不同浏览器的XMLHttp对象。具体实现代码如下:

function loadXMLDoc(url) {
  var xmlhttp;
  if (window.XMLHttpRequest) {
    // IE7+、Firefox、Chrome、Opera和Safari
    xmlhttp = new XMLHttpRequest();
  } else {
    // IE6、IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
      var xmlDoc = xmlhttp.responseXML;
      parseXML(xmlDoc);
    }
  };
  xmlhttp.open("GET", url, true);
  xmlhttp.send();
}

XMLHttpRequest方式

使用XMLHttpRequest方式获取XML文档的代码如下:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'example.xml', true);
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    var xmlDoc = xhr.responseXML;
    parseXML(xmlDoc);
  }
};
xhr.send();

步骤二:解析XML文档

解析使用DOM方式

使用DOM方式解析XML文档,需要将XML文档转化为一棵树形结构,可以使用js的DOM方法进行访问。

具体实现代码如下:

function parseXML(xmlDoc) {
  var xmlRoot = xmlDoc.documentElement;
  // 获取根节点
  var name = xmlRoot.nodeName;
  // 获取节点名称
  var attrs = xmlRoot.attributes;
  // 获取节点属性
  var children = xmlRoot.childNodes;
  // 获取子节点列表
  for (var i = 0; i < children.length; i++) {
    var child = children[i];
    if (child.nodeType == 1) {
      // 节点类型为元素节点
      var childName = child.nodeName;
      var childAttrs = child.attributes;
      var grandchildren = child.childNodes;
      // ... 具体操作
    } else if (child.nodeType == 3) {
      // 节点类型为文本节点
      var text = child.nodeValue;
      // ... 具体操作
    }
  }
}

解析使用SAX方式

使用SAX方式解析XML文档,需要定义事件处理函数,处理每个元素或属性的事件。

具体实现代码如下:

function parseXML(xmlDoc) {
  var parser = new DOMParser();
  var xmlStr = new XMLSerializer().serializeToString(xmlDoc);
  // 将XML文档转化为字符串
  var parser = sax.parser(true);
  parser.onerror = function(err) {
    console.error(err);
  };
  // 错误处理事件
  parser.onopentag = function(node) {
    // 元素节点开始事件
    console.log("Element start: " + node.name);
  };
  parser.onclosetag = function(node) {
    // 元素节点结束事件
    console.log("Element end: " + node.name);
  };
  parser.onattribute = function(attr) {
    // 属性节点事件
    console.log("Attribute: " + attr.name + " = " + attr.value);
  };
  parser.ontext = function(text) {
    // 文本节点事件
    console.log("Text: " + text);
  };
  parser.write(xmlStr).close();
}

通过以上两种方式,我们就可以获取XML文档并解析XML文档。其中,Ajax方式适用于简单的XML文档,XMLHttpRequest方式适用于稍微复杂一些的XML文档;DOM方式适用于处理小型XML文档,SAX方式适用于处理大型XML文档或需要忽略部分信息的情况。

下面是一个使用DOM方式解析XML文档的完整示例:

<!doctype html>
<html>
<head>
  <title>XML解析示例</title>
  <meta charset="utf-8">
  <script>
    function loadXMLDoc(url) {
      var xmlhttp;
      if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
      } else {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
          var xmlDoc = xmlhttp.responseXML;
          parseXML(xmlDoc);
        }
      };
      xmlhttp.open("GET", url, true);
      xmlhttp.send();
    }

    function parseXML(xmlDoc) {
      var xmlRoot = xmlDoc.documentElement;
      var name = xmlRoot.nodeName;
      console.log("节点名称:", name);
      var attrs = xmlRoot.attributes;
      for (var i = 0; i < attrs.length; i++) {
        console.log("属性名称:" + attrs[i].name + ",属性值:" + attrs[i].value);
      }
      var children = xmlRoot.childNodes;
      for (var i = 0; i < children.length; i++) {
        var child = children[i];
        if (child.nodeType == 1) {
          var childName = child.nodeName;
          console.log("子节点名称:", childName);
          var childAttrs = child.attributes;
          for (var j = 0; j < childAttrs.length; j++) {
            console.log("子节点属性名称:" + childAttrs[j].name + ",属性值:" + childAttrs[j].value);
          }
          var grandchildren = child.childNodes;
          for (var j = 0; j < grandchildren.length; j++) {
            var grandchild = grandchildren[j];
            if (grandchild.nodeType == 1) {
              console.log("孙子节点名称:", grandchild.nodeName);
            } else if (grandchild.nodeType == 3) {
              console.log("文本节点:", grandchild.nodeValue.trim());
            }
          }
        }
      }
    }
  </script>
</head>
<body>
  <input type="button" value="获取XML文档" onclick="loadXMLDoc('example.xml')">
</body>
</html>

其中,example.xml文档内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore category="web" location="Beijing">
  <book id="001" language="Chinese">
    <title>HTML5 Programming</title>
    <author>Zhang San</author>
    <price>50</price>
  </book>
  <book id="002" language="English">
    <title>CSS3 Handbook</title>
    <author>Li Si</author>
    <price>60</price>
  </book>
</bookstore>

运行html文件,点击按钮获取XML文档,控制台输出结果如下:

节点名称: bookstore
属性名称:category,属性值:web
属性名称:location,属性值:Beijing
子节点名称: book
子节点属性名称:id,属性值:001
子节点属性名称:language,属性值:Chinese
孙子节点名称: title
文本节点: HTML5 Programming
孙子节点名称: author
文本节点: Zhang San
孙子节点名称: price
文本节点: 50
子节点名称: book
子节点属性名称:id,属性值:002
子节点属性名称:language,属性值:English
孙子节点名称: title
文本节点: CSS3 Handbook
孙子节点名称: author
文本节点: Li Si
孙子节点名称: price
文本节点: 60

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS解析XML的实现代码 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • word文档输入数以和英文字母出现乱码方框该怎么办?

    在word文档中,可能会出现数以和英文字母出现乱码方框的情况,这种情况主要是因为word文档的字符编码与输入字符的编码不一致导致的。下面我将介绍两种解决方案,分别是调整字符编码和更换字体。 调整字符编码 当我们输入字符时,选择的编码格式与word文档原有的编码格式不一致时,就会出现乱码方框的情况。这时,我们可以调整字符编码来解决问题。 打开word文档,选中…

    html 2023年5月31日
    00
  • XML轻松学习手册(四):XML语法

    《XML轻松学习手册(四):XML语法》是一篇介绍XML语法的文章,主要介绍了XML元素、属性、命名空间等语法及其语法规则。下面是对该手册的完整攻略。 1. 文章结构分析 文章结构分为以下部分: 序言:简短的介绍一下XML的基本知识; XML元素:介绍XML元素的定义、命名规则和语法规则,并提供示例; XML属性:介绍XML属性的定义、命名规则和语法规则,并…

    html 2023年5月30日
    00
  • 电脑打字乱码怎么办? txt文字变乱码的解决办法

    电脑打字乱码怎么办?txt文字变乱码的解决办法 问题描述 在使用电脑打字的过程中,有时会出现乱码的情况,即在打出的文字中出现了一些奇怪的符号或变为乱码,此时无法正常阅读和编辑。这种情况在打开txt文本时也可能出现。 解决方案 出现这种情况时,我们可以采取以下几种方案: 方案一:修改编码方式 打开乱码的文本文件(如:txt文件),在左上角找到“文件”菜单,点击…

    html 2023年5月31日
    00
  • wps打开文档乱码怎么修复?wps打开文档乱码修复方法

    WPS打开文档乱码修复攻略 问题描述 WPS打开文档时,出现了乱码的情况,其中包括中文乱码、符号乱码、编码乱码等。这种情况下,会影响到用户的正常使用,需要及时处理。 可能的原因 文件编码与WPS默认编码不同。 文档使用的是罕见字符集。 旧版本文件无法兼容新版本WPS。 文件损坏或病毒感染。 解决方法 方法一:修改WPS默认编码 当乱码出现时,我们可以尝试修改…

    html 2023年5月31日
    00
  • txt文件打开显示乱码怎么办?

    “txt文件打开显示乱码怎么办?”的完整攻略 问题描述: 在使用文本编辑器打开txt文件时,发现文件内容显示为乱码。 可能原因: 文件编码与打开工具默认编码不一致,导致文本解析出现问题。 文件受到病毒或者其他恶意程序的修改,导致文件内容发生了改变。 解决方案: 方案一:修改打开文件的编码方式 首先需要确认文件本身的编码方式,可以使用其他能够正常显示文本的工具…

    html 2023年5月31日
    00
  • SpringBoot YAML语法基础详细整理

    SpringBoot YAML语法基础详细整理 什么是YAML? YAML是一种人类可读的数据序列化格式,它被广泛应用于各种编程语言中,包括Java。YAML以比JSON和XML更清晰的方式来表示数据,同时具有更好的阅读性和易懂性。 YAML的基本语法 键值对 使用冒号将键和值分开,键和值之间必须有空格。 foo: bar 列表 使用短横线表示项,项和项之间…

    html 2023年5月30日
    00
  • 如何使用XPath提取xml文档数据

    XPath是一种标准的XML查询语言,它允许开发者在XML文档中检索或提取数据。对于开发者来说,了解XPath的用法非常重要,因为它可以提高代码的效率和可读性。下面是如何使用XPath提取XML文档数据的完整攻略。 一、XPath常用语法和表达式 XPath支持的语法和表达式非常丰富。以下是一些常见的语法和表达式: 1.路径表达式 XPath使用路径表达式来…

    html 2023年5月30日
    00
  • PHP页面转UTF-8中文编码乱码的解决办法

    下面就是PHP页面转UTF-8中文编码乱码的解决办法的完整攻略。 背景 在 web 开发中,有时我们会遇到 PHP 页面中文编码乱码的情况,这给用户的阅读体验和开发者的开发效率都带来很大的影响。本文将介绍 PHP 页面转 UTF-8 中文编码乱码的解决办法。 原因 引起 PHP 页面中文编码乱码的原因可能有很多,常见的有以下两个: 页面编码和数据库编码不一致…

    html 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部