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日

相关文章

  • JavaScript中块级作用域与函数作用域深入剖析

    JavaScript中块级作用域与函数作用域深入剖析 在JavaScript中,作用域是指在程序中可以直接访问变量的区域。JavaScript中常见的两种作用域是块级作用域和函数作用域。本文将深入讲解JavaScript中块级作用域和函数作用域的内部原理。 块级作用域 块级作用域指定义在代码块内部的变量和函数。在ES6之前,JavaScript并没有块级作用…

    JavaScript 2023年6月10日
    00
  • JavaScript自定义DateDiff函数(兼容所有浏览器)

    下面是详细讲解“JavaScript自定义DateDiff函数(兼容所有浏览器)”的完整攻略。 标题 1. 问题描述 在JavaScript中计算两个日期之间的时间差并不是一个简单的操作。虽然JavaScript有自带的Date对象,可以计算日期之间的差值,但在不同的浏览器中,它的表现和运算方式是不一样的,这就会导致一些兼容性问题。因此,在实际开发中,我们经…

    JavaScript 2023年5月27日
    00
  • 魔鬼字典 JavaScript 笔记 代码比较多乱

    作为网站的作者,我很高兴为您讲解“魔鬼字典JavaScript笔记代码比较多乱”的攻略。下面,我将为您分别介绍该笔记的结构和示例代码的解读。 一、笔记结构 该笔记使用了Markdown格式编写,并通过代码块对示例代码进行了展示。具体来说,其结构如下: 标题 每篇笔记的顶部都有一个标题,用于概括该笔记的主题,方便读者快速理解。 前言 在笔记主体部分之前,通常会…

    JavaScript 2023年5月19日
    00
  • DOM基础教程之事件类型

    下面是关于“DOM基础教程之事件类型”的完整攻略: 1. 什么是事件? 事件是指用户在与页面进行交互时所发生的情况,如鼠标点击、键盘敲击、表单提交等。开发者可以通过JavaScript代码来响应这些事件,从而实现与用户进行有效的交互。 2. 事件类型 DOM中常见的事件类型有: 鼠标事件:onclick, ondblclick, onmousedown, o…

    JavaScript 2023年6月10日
    00
  • SUN的《AJAX与J2EE》全文译了

    好的。首先,要全文翻译 SUN 的《AJAX 与 J2EE》文档,需要先下载该文档,然后使用翻译软件或者通过人工翻译的方式进行翻译。在这个过程中,需要注意以下几点: 确认目标语言,比如翻译成中文、日文、韩文等等,同时需要尽可能保证翻译的准确性、专业性和流畅性。 在进行翻译时,需要考虑到 Markdown 格式的特点,比如代码块、标题、列表等等,需要在翻译中保…

    JavaScript 2023年6月11日
    00
  • 老生常谈ES6中的类

    ES6中的类是JavaScript语言中的一种新的语法糖,它提供了一种更加优雅的面向对象的编程方式,让JavaScript变得更加易读、易维护。在ES6之前,我们在JavaScript中实现继承是通过原型链来实现的。但是这种方式缺少了一个明确的语法结构,不够直观,而且容易出现错误。ES6中引入了类的概念,让我们能够更加方便、清晰地定义类和继承关系。下面我将详…

    JavaScript 2023年6月11日
    00
  • js canvas实现圆形流水动画

    下面是详细的js canvas实现圆形流水动画的攻略: 1. 准备工作 在HTML中,我们需要创建一个canvas元素,用于显示流水效果。 <canvas id="myCanvas"></canvas> 在JavaScript中,我们需要获取该canvas元素,并在其中绘制圆形流水。需要注意:canvas绘图需要在…

    JavaScript 2023年6月10日
    00
  • 微信小程序 Page()函数详解

    微信小程序 Page() 函数详解 什么是 Page() 函数 在微信小程序中,一个页面通常对应着一个 .js 文件,这个 .js 文件中定义了一个名为 Page() 的函数。Page() 函数是小程序开发中最基础、最重要的函数之一,它用于定义一个页面,包括页面的生命周期函数、页面事件处理函数以及数据等内容。 Page() 函数语法 Page({ data:…

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