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

yizhihongxing

下面是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多个表单数据提交下的serialize()应用实例分析

    下面我将详细讲解“JS多个表单数据提交下的serialize()应用实例分析”的完整攻略。 概述 在Web开发中,我们通常会使用表单来收集用户的数据,并将这些数据提交到服务器端。而在客户端将表单数据序列化为字符串时,我们可以使用serialize()方法。这个方法将所有的表单字段序列化为标准的URL编码表示形式。 但是,如果我们的页面有多个表单,该如何进行多…

    JavaScript 2023年6月10日
    00
  • Json序列化和反序列化方法解析

    Json序列化和反序列化方法解析 什么是JSON序列化和反序列化 JSON是JavaScript Object Notation的缩写,它是一种轻量级的数据交换格式。JSON序列化是将对象转换成JSON字符串的过程,而JSON反序列化则是将JSON字符串转换回对象的过程。 JSON序列化方法 在C#中,可以使用Json.Net库来完成JSON序列化。下面是一…

    JavaScript 2023年5月27日
    00
  • 使用cookie绕过验证码登录的实现代码

    首先,在介绍使用cookie绕过验证码登录的实现前,有必要了解一下什么是cookie。 什么是cookie 在前后端分离的web应用中,一般使用cookie来维持用户的登陆状态,如购物车、身份认证、页面交互等。cookie是一种储存在用户浏览器中的小型文本文件,通常包含一些用于搜索查询、网站记住用户信息、统计网站访问数量和收集访客习惯数据等等。具体实现方式是…

    JavaScript 2023年6月11日
    00
  • JS函数节流和防抖之间的区分和实现详解

    JS函数节流和防抖是前端开发中常用的优化技巧,以有效降低网页在滚动或者拖拽等交互操作时因为事件处理函数过多而造成的页面卡顿和性能问题。两者的实现方式也有所区别,本文将结合示例详细讲解它们之间的区分和实现方法。 什么是JS函数节流? JS函数节流指的是在一段时间内,无论触发多少次函数,只执行一次。也就是说,在执行函数的时间间隔内,不管触发了多少次函数,只有一次…

    JavaScript 2023年6月11日
    00
  • javascript for循环性能测试示例

    当我们使用for循环来迭代一个数组或者对象时,我们经常会遇到性能问题。好在JavaScript 提供了一些可以优化循环性能的技术,如缓存循环长度、使用前置递增值等。 本文将介绍如何通过性能测试来比较 for 循环的类型,以及如何优化 for 循环的性能。 第一步:创建数组和循环 首先,我们创建一个包含 1000000 个随机数的数组。 let arr = […

    JavaScript 2023年5月28日
    00
  • JavaScript canvas实现动态点线效果

    下面就是详细讲解 JavaScript canvas 实现动态点线效果的完整攻略。 简介 Canvas 是 HTML5 中一个非常重要的特性,它可以用 JavaScript 来绘制图像,包括各种形状、文本、图片以及动画等。我们可以通过 Canvas 实现各种炫酷的效果,其中动态点线效果就是其中的一种。 实现过程 1. 构建 Canvas 环境 首先,我们需要…

    JavaScript 2023年6月11日
    00
  • 详解TS对象扩展运算符和rest运算符

    详解TS对象扩展运算符和rest运算符 什么是对象扩展运算符和rest运算符 对象扩展运算符(也称为Spread运算符)和rest运算符(也称为剩余参数运算符)都是ES6新增的两种运算符。它们可以用于处理对象或数组中的元素,让代码更加简洁易读,常见于函数参数和数组/对象合并操作。 简单来说,对象扩展运算符可以将一个对象展开成多个对象,而rest运算符则可以将…

    JavaScript 2023年6月10日
    00
  • JS动态创建Table,Tr,Td并赋值的具体实现

    下面是“JS动态创建Table,Tr,Td并赋值的具体实现”的攻略。 实现方法 使用JavaScript可以很方便地动态创建表格,具体步骤如下: 创建一个 元素,用于存放动态创建的表格。 使用JavaScript的循环语句,例如for循环或while循环,根据需要动态创建需要的行(tr)和列(td)。 在创建每个行(tr)时,使用循环语句动态创建所需的列(t…

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