xml转json的js代码

XML转JSON是开发过程中常见的问题,有时候需要将后端返回的XML数据转换为前端需要的JSON格式。以下是XML转JSON的JS代码的详细攻略:

一、XML转JSON的原理

XML和JSON是两种不同的数据格式,因此需要编写代码将XML转换为JSON格式。XML数据以标签为基础,有嵌套的结构关系,而JSON数据则以键值对为基础,没有嵌套的结构关系。因此,将XML转成JSON需要把XML中的标签转成JSON的键,将标签中的内容转成JSON的值,最后将所有生成的键值对组成JSON对象。

二、XML转JSON的步骤

1.获取XML对象

首先需要通过XMLHttpRequest获取XML对象,例如:

let xhr = new XMLHttpRequest();

xhr.onload = function() {
  if (xhr.status == 200) {
    let xmlData = xhr.responseXML; //获取XML对象
  }
}
xhr.open('GET', 'example.xml', true);
xhr.send();

2.解析XML对象

通过DOM方式或SAX方式解析XML对象来获取标签名称和标签值,例如使用DOM方式解析XML对象:

let xmlData = xhr.responseXML;
let parser = new DOMParser();
let xmlDoc = parser.parseFromString(xmlData, "text/xml");
let rootElement = xmlDoc.documentElement;

在获取了XML对象之后,需要使用DOMParser对象将XML解析为一个文档对象(Document)。

3.转换JSON对象

解析XML对象后,需要将XML转换为JSON对象,这里举一个简单的例子,比如以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="children">
    <title>The Cat in the Hat</title>
    <author>Dr. Seuss</author>
    <year>1957</year>
  </book>
  <book category="web">
    <title>Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
  </book>
</bookstore>

使用以下代码可以将其转换为JSON对象:

function xmlToJson(xml) {
  let obj = {};

  if (xml.nodeType == 1) {
    if (xml.attributes.length > 0) {
      obj["@attributes"] = {};
      for (let i = 0; i < xml.attributes.length; i++) {
        let attribute = xml.attributes.item(i);
        obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
      }
    }
  } else if (xml.nodeType == 3) {
    obj = xml.nodeValue.trim();
  }

  if (xml.hasChildNodes()) {
    for (let i = 0; i < xml.childNodes.length; i++) {
      let item = xml.childNodes.item(i);
      let nodeName = item.nodeName;

      if (typeof(obj[nodeName]) == "undefined") {
        obj[nodeName] = xmlToJson(item);
      } else {
        if (typeof(obj[nodeName].push) == "undefined") {
          let old = obj[nodeName];
          obj[nodeName] = [];
          obj[nodeName].push(old);
        }

        obj[nodeName].push(xmlToJson(item));
      }
    }
  }

  return obj;
}

let json = JSON.stringify(xmlToJson(rootElement));

通过递归遍历XML文件中的所有节点,将XML节点转化为JSON格式的数据。

转换后的JSON对象为:

{
  "bookstore": {
    "book": [
      {
        "@attributes": {
          "category": "children"
        },
        "title": "The Cat in the Hat",
        "author": "Dr. Seuss",
        "year": "1957"
      },
      {
        "@attributes": {
          "category": "web"
        },
        "title": "Learning XML",
        "author": "Erik T. Ray",
        "year": "2003"
      }
    ]
  }
}

三、XML转JSON的示例

以下是针对上述的XML文件,使用XML转JSON的JS代码的完整示例:

let xhr = new XMLHttpRequest();

xhr.onload = function() {
  if (xhr.status == 200) {
    let xmlData = xhr.responseXML;
    let parser = new DOMParser();
    let xmlDoc = parser.parseFromString(xmlData, "text/xml");
    let rootElement = xmlDoc.documentElement;

    function xmlToJson(xml) {
      let obj = {};

      if (xml.nodeType == 1) {
        if (xml.attributes.length > 0) {
          obj["@attributes"] = {};
          for (let i = 0; i < xml.attributes.length; i++) {
            let attribute = xml.attributes.item(i);
            obj["@attributes"][attribute.nodeName] = attribute.nodeValue;
          }
        }
      } else if (xml.nodeType == 3) {
        obj = xml.nodeValue.trim();
      }

      if (xml.hasChildNodes()) {
        for (let i = 0; i < xml.childNodes.length; i++) {
          let item = xml.childNodes.item(i);
          let nodeName = item.nodeName;

          if (typeof(obj[nodeName]) == "undefined") {
            obj[nodeName] = xmlToJson(item);
          } else {
            if (typeof(obj[nodeName].push) == "undefined") {
              let old = obj[nodeName];
              obj[nodeName] = [];
              obj[nodeName].push(old);
            }

            obj[nodeName].push(xmlToJson(item));
          }
        }
      }

      return obj;
    }

    let json = JSON.stringify(xmlToJson(rootElement));
    console.log(json);
  }
}
xhr.open('GET', 'example.xml', true);
xhr.send();

执行结果为:

{
  "bookstore": {
    "book": [
      {
        "@attributes": {
          "category": "children"
        },
        "title": "The Cat in the Hat",
        "author": "Dr. Seuss",
        "year": "1957"
      },
      {
        "@attributes": {
          "category": "web"
        },
        "title": "Learning XML",
        "author": "Erik T. Ray",
        "year": "2003"
      }
    ]
  }
}

另外,对于一些常用的前端框架,如Vue.js、React等都有相关的第三方库可以方便地进行XML转JSON的操作,使用时也可以考虑使用这些库来简化开发过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:xml转json的js代码 - Python技术站

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

相关文章

  • javascript实现数字时钟效果

    下面是详细讲解 JavaScript 实现数字时钟效果的完整攻略。 1. HTML 结构 首先需要在 HTML 文件中添加用于展示时间的结构。 <div id="clock"> <span id="hours"></span> : <span id="minutes&…

    JavaScript 2023年5月27日
    00
  • C#的WEBBROWSER与JS交互小结

    下面我将详细讲解“C#的WEBBROWSER与JS交互小结”的完整攻略。 简介 WEBBROWSER是Windows Forms中提供的一个控件,可以直接将Web页面嵌入到WinFrom应用程序中。WEBBROWSER中内置了一个解析HTML的引擎,可以渲染和展示Web页面。由于WEBBROWSER可以作为WinFrom应用程序的一部分,它可以与其他组件一起…

    JavaScript 2023年6月10日
    00
  • js数组相减简单示例【删除a数组所有与b数组相同元素】

    下面是针对js数组相减简单示例【删除a数组所有与b数组相同元素】的完整攻略: 步骤一:创建两个数组 首先我们需要创建两个数组,分别是a数组和b数组。可以通过以下代码创建: const a = [1, 2, 3, 4, 5]; const b = [3, 4, 5, 6, 7]; 步骤二:使用filter方法过滤出不同元素 接下来我们需要使用数组的filter…

    JavaScript 2023年5月28日
    00
  • 重试,让程序更健壮

    任何通过网络与其它应用通讯地的程序,都应该有足够的灵活性,来应对短暂的临时性故障。因为这些故障很多时候是可以自恢复的。 例如,为了避免服务过载,很多应用会采取某些限流措施,在并发请求达到一定数量时,暂时性的拒绝新的请求加入。这种情况下,尝试使用该应用的程序,一开始可能会被拒绝连接,但下一刻就好了。 因此,在设计系统时,应该考虑到此种故障。并且在条件允许时,加…

    JavaScript 2023年4月17日
    00
  • 在JS中解析HTML字符串示例代码

    在JS中解析HTML字符串示例代码的完整攻略如下: 使用innerHTML解析HTML字符串 一个常见的方法是使用innerHTML属性来解析HTML字符串并将其渲染到DOM中。这个方法非常简单,只需将待渲染的HTML字符串赋值给目标元素的innerHTML属性即可。例如,假设我们有一个包含HTML代码的字符串,我们可以这样解析它: const htmlSt…

    JavaScript 2023年5月19日
    00
  • JavaScript数据类型转换实例(其他类型转字符串、数值型、布尔类型)

    当我们在开发 JavaScript 时经常会遇到需要将一个数据类型转换为另外一种类型的情况,比如数字转字符串、布尔型转数字等等,本文将为大家介绍 JavaScript 数据类型转换实例,内容包括其他类型转字符串、数值型、布尔类型的转换。 其他类型转字符串 在 JavaScript 中,我们可以使用 toString() 方法将其他类型转换为字符串类型,例如:…

    JavaScript 2023年5月28日
    00
  • 解决React报错React Hook useEffect has a missing dependency

    下面是解决React报错React Hook useEffect has a missing dependency 的完整攻略: 一、报错原因 首先,我们需要了解报错原因。 在使用 React Hooks 的过程中,如果 useEffect 中使用了某些变量或函数,但没有将它们添加到依赖项数组中,就会出现 “React Hook useEffect has …

    JavaScript 2023年6月11日
    00
  • html页面显示年月日时分秒和星期几的两种方式

    让我们来探讨一下如何在HTML页面中显示当前的年月日、时分秒和星期几的两种方式。 方式一:使用JavaScript实现 实现步骤: 在HTML页面中添加一个显示日期时间的标签,例如这里我们使用<p>标签作为容器,<p id=”datetime”></p>: <p id="datetime">…

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