JS操作xml对象转换为Json对象示例

下面是JS操作XML对象转换为JSON对象示例的完整攻略。

什么是XML对象和JSON对象?

XML(Extensible Markup Language) 是一种文本格式的标记语言,用于存储和传输数据。XML 文件可作为 Web 文档来读取和呈现。

JSON(JavaScript Object Notation) 是一种轻量级的数据格式,它是一种文本格式的数据交换形式。

在现代网站及Web应用中,数据的传输格式一般采用JSON格式,也有时采用XML格式。

XML对象与JSON对象互相转换

由于在前端开发过程中,有时需要将一个由服务端返回的XML对象,转换为客户端能够直接操作和使用的JSON对象。这时需要以下述方法进行转换:

1. 创建XML对象

在 JavaScript 中,XMLHttpRequest 可以用于从 Web 服务器上请求 XML 数据并将其返回到客户端。

var xhr = new XMLHttpRequest();
xhr.open("GET", "example.xml", false);  // 同步请求
xhr.send(null);
var xml = xhr.responseXML;

2. 将XML对象转换为JSON对象

我们可以使用DOM解析库,将XML对象转换为JSON对象。

function xml2json(xml) {
  var json = {};
  if (xml.nodeType === 1) {  // 元素节点
    if (xml.attributes.length > 0) {
      json["@attributes"] = {};
      for (var i = 0; i < xml.attributes.length; i++) {
        var attr = xml.attributes.item(i);
        json["@attributes"][attr.nodeName] = attr.nodeValue.trim();
      }
    }
  } else if (xml.nodeType === 3) {  // 文本节点
    json = xml.nodeValue.trim();
  }
  if (xml.hasChildNodes()) {
    for(var i = 0; i < xml.childNodes.length; i++) {
      var child = xml.childNodes.item(i);
      var nodeName = child.nodeName;
      if (typeof(json[nodeName]) === "undefined") {
        json[nodeName] = xml2json(child);
      } else {
        if (typeof(json[nodeName].push) === "undefined") {
          var old = json[nodeName];
          json[nodeName] = [];
          json[nodeName].push(old);
        }
        json[nodeName].push(xml2json(child));
      }
    }
  }
  return json;
}

var json = xml2json(xml);

上述代码,通过递归地遍历XML节点,将XML节点转化成对应的JSON对象,以直接在前端使用。

3. 将JSON对象转换为XML对象

如果需要将JSON对象转换为XML对象,我们可以使用dom-parser库。

function json2xml(json, rootName) {
  var xmlDoc = document.implementation.createDocument("", "", null);
  var rootEl = xmlDoc.createElement(rootName);
  xmlDoc.appendChild(rootEl);

  function appendNodes(parentEl, json) {
    Object.keys(json).forEach(function(key) {
      var value = json[key];
      var childEl;
      if (Array.isArray(value)) {
        value.forEach(function(childJson) {
          childEl = xmlDoc.createElement(key);
          parentEl.appendChild(childEl);
          appendNodes(childEl, childJson);
        });
      } else if (isObject(value)) {
        childEl = xmlDoc.createElement(key);
        parentEl.appendChild(childEl);
        appendNodes(childEl, value);
      } else {
        childEl = xmlDoc.createElement(key);
        childEl.textContent = value;
        parentEl.appendChild(childEl);
      }
    });
  }

  function isObject(o) {
    return o && typeof o === 'object' && o.constructor === Object;
  }

  appendNodes(rootEl, json);
  return xmlDoc;
}

var xml = json2xml(json, "root");

上述代码,通过递归地遍历JSON对象,将JSON转化成对应的XML对象。

示例

下面是两个示例,让你更好地理解XML对象和JSON对象互转的过程和方法。

示例1

假设服务器返回的XML对象如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="fiction">
    <title lang="en">Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="children">
    <title lang="en">The Lion King</title>
    <author>Disney</author>
    <year>1994</year>
    <price>19.95</price>
  </book>
</bookstore>

我们需要将它转换成JSON对象,代码如下:

function xml2json(xml) {
  var json = {};
  if (xml.nodeType === 1) {  // 元素节点
    if (xml.attributes.length > 0) {
      json["@attributes"] = {};
      for (var i = 0; i < xml.attributes.length; i++) {
        var attr = xml.attributes.item(i);
        json["@attributes"][attr.nodeName] = attr.nodeValue.trim();
      }
    }
  } else if (xml.nodeType === 3) {  // 文本节点
    json = xml.nodeValue.trim();
  }
  if (xml.hasChildNodes()) {
    for(var i = 0; i < xml.childNodes.length; i++) {
      var child = xml.childNodes.item(i);
      var nodeName = child.nodeName;
      if (typeof(json[nodeName]) === "undefined") {
        json[nodeName] = xml2json(child);
      } else {
        if (typeof(json[nodeName].push) === "undefined") {
          var old = json[nodeName];
          json[nodeName] = [];
          json[nodeName].push(old);
        }
        json[nodeName].push(xml2json(child));
      }
    }
  }
  return json;
}

var xmlString = '<?xml version="1.0" encoding="UTF-8"?><bookstore><book category="fiction"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book><book category="children"><title lang="en">The Lion King</title><author>Disney</author><year>1994</year><price>19.95</price></book></bookstore>';
var parser = new DOMParser();
var xml = parser.parseFromString(xmlString, "text/xml");
var json = xml2json(xml);

console.log(json);

输出的结果如下:

{
  "@attributes": {},
  "bookstore": {
    "book": [{
      "@attributes": {
        "category": "fiction"
      },
      "title": {
        "@attributes": {
          "lang": "en"
        },
        "#text": "Harry Potter"
      },
      "author": "J.K. Rowling",
      "year": "2005",
      "price": "29.99"
    }, {
      "@attributes": {
        "category": "children"
      },
      "title": {
        "@attributes": {
          "lang": "en"
        },
        "#text": "The Lion King"
      },
      "author": "Disney",
      "year": "1994",
      "price": "19.95"
    }]
  }
}

示例2

假设我们有一个JSON对象如下所示:

{
  "@attributes": {},
  "bookstore": {
    "book": [{
      "@attributes": {
        "category": "fiction"
      },
      "title": {
        "@attributes": {
          "lang": "en"
        },
        "#text": "Harry Potter"
      },
      "author": "J.K. Rowling",
      "year": "2005",
      "price": "29.99"
    }, {
      "@attributes": {
        "category": "children"
      },
      "title": {
        "@attributes": {
          "lang": "en"
        },
        "#text": "The Lion King"
      },
      "author": "Disney",
      "year": "1994",
      "price": "19.95"
    }]
  }
}

我们需要将它转换成XML对象,并设置根节点为bookstore,代码如下:

function json2xml(json, rootName) {
  var xmlDoc = document.implementation.createDocument("", "", null);
  var rootEl = xmlDoc.createElement(rootName);
  xmlDoc.appendChild(rootEl);

  function appendNodes(parentEl, json) {
    Object.keys(json).forEach(function(key) {
      var value = json[key];
      var childEl;
      if (Array.isArray(value)) {
        value.forEach(function(childJson) {
          childEl = xmlDoc.createElement(key);
          parentEl.appendChild(childEl);
          appendNodes(childEl, childJson);
        });
      } else if (isObject(value)) {
        childEl = xmlDoc.createElement(key);
        parentEl.appendChild(childEl);
        appendNodes(childEl, value);
      } else {
        childEl = xmlDoc.createElement(key);
        childEl.textContent = value;
        parentEl.appendChild(childEl);
      }
    });
  }

  function isObject(o) {
    return o && typeof o === 'object' && o.constructor === Object;
  }

  appendNodes(rootEl, json);
  return xmlDoc;
}

var xml = json2xml(json, "bookstore");

console.log(xml);

输出的结果如下:

<?xml version="1.0" encoding=""/><bookstore>
  <book category="fiction">
    <title lang="en">Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="children">
    <title lang="en">The Lion King</title>
    <author>Disney</author>
    <year>1994</year>
    <price>19.95</price>
  </book>
</bookstore>

以上就是JS操作XML对象转换为JSON对象的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS操作xml对象转换为Json对象示例 - Python技术站

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

相关文章

  • JS数据类型STRING使用实例解析

    关于“JS数据类型STRING使用实例解析”的攻略,我可以为你提供以下内容。 什么是JS中的字符串(STRING)类型? 字符串是JS中最常用的一种数据类型,用于表示文本,由一系列Unicode字符组成。在JS中,字符串以单引号、双引号或反引号 包裹起来,这三种方式是等价的。 比如: // 使用单引号包括字符串 let str1 = ‘Hello World…

    JavaScript 2023年5月28日
    00
  • Date对象格式化函数代码

    下面是详细的“Date对象格式化函数代码”的攻略: 什么是Date对象 Date对象是JavaScript的内置对象之一,用于表示日期和时间,可以获取当前时间、创建指定日期时间的对象、设置日期时间等操作。该对象拥有一些常用的方法,例如getDate()、getFullYear()、getMonth()等,用于获取日期和时间中的具体值。 Date对象格式化函数…

    JavaScript 2023年6月10日
    00
  • javascript静态页面传值的三种方法分享

    以下是“javascript静态页面传值的三种方法分享”的完整攻略: 一、前言 在网页应用开发中,常常需要将一个页面的数据传递给另一个页面,在静态网页中实现页面之间的数据传递非常重要。本文将介绍三种常见的静态页面传值的方法,并提供相应的示例代码。 二、URL传参 URL传参是应用最广泛的传值方式之一,在URL中添加参数,然后通过JavaScript获取这些参…

    JavaScript 2023年6月11日
    00
  • js 调用本地exe的例子(支持IE内核的浏览器)

    下面将详细讲解“JS 调用本地 EXE 的例子(支持 IE 内核的浏览器)”的完整攻略,并提供两条示例。 准备工作 在进行本地 EXE 执行前,需要进行以下准备工作: 在服务器上放置本地 EXE 程序。 使用本地服务器,将前端代码放置于本地服务器上,这样才能执行本地 EXE 程序。 使用 IE 内核的浏览器,否则无法执行本地 EXE 程序。 JS 调用本地 …

    JavaScript 2023年5月27日
    00
  • ASP.NET获取不到JS设置cookies的解决方法

    如果ASP.NET获取不到JS设置cookies,可能存在以下几种原因: cookie被浏览器的安全机制阻止了 cookie的路径设置不正确 cookie的域名设置不正确 为了解决这个问题,可以采用以下方法: 方法一:设置HttpOnly 将cookie设置为httpOnly可以解决许多cookie被攻击的问题,同时也可以解决ASP.NET获取不到JS设置的…

    JavaScript 2023年6月11日
    00
  • 如何用JS追踪用户

    下面是关于如何用JS追踪用户的完整攻略: 1. 获取用户信息 我们可以使用JS来获取用户的一些相关信息,如用户的浏览器信息、设备信息、操作系统信息等。例如,我们可以使用以下代码来获取用户的浏览器名称及版本: var browser = navigator.userAgent.toLowerCase(); if (browser.indexOf("m…

    JavaScript 2023年5月27日
    00
  • javascript判断机器是否联网的2种方法

    让我来为您提供关于”Javascript判断机器是否联网的2种方法”的详细攻略。 方法一:使用navigator.onLine属性 使用navigator.onLine属性是JavaScript判断机器是否联网的最简单方法之一。该属性是一个布尔值,指示设备是否联网。 以下是使用navigator.onLine的示例代码: if (navigator.onLi…

    JavaScript 2023年6月11日
    00
  • JS正则表达式必须包含数字、字母、特殊字符

    关于JS正则表达式必须包含数字、字母、特殊字符的攻略,主要分为以下几个步骤: 1. 确定正则表达式表达目标 我们要使用正则表达式对用户输入的密码进行验证,确保密码由数字、字母、特殊字符组成。因此,我们需要确定明确的目标,即密码必须包含数字、字母、特殊字符。 2. 编写正则表达式 我们可以编写以下正则表达式来验证密码是否包含数字、字母、特殊字符: /^(?=.…

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