使用Javascript将XML转换为JSON(并返回)

Jas*_*rez 137 javascript xml jquery json format-conversion

您如何从XML转换为JSON然后再转换回XML?

以下工具运行良好,但不完全一致:

有没有人遇到过这种情况?

Jos*_*ola 94

我认为这是最好的: 在XML和JSON之间进行转换

请务必阅读xml.com O'Reilly网站上相关文章,其中详细介绍了这些转换的问题,我认为您会发现这些问题很有启发性.O'Reilly主持该文章的事实应该表明Stefan的解决方案具有优点.

  • 请注意,这是一个Copyleft许可解决方案.在编写开源软件时,这只是一个选项. (3认同)

abd*_*nce 47

https://github.com/abdmob/x2js - 我自己的库(来自http://code.google.com/p/x2js/的更新网址):

该库提供XML到JSON(JavaScript对象),反之亦然javascript转换函数.该库非常小,不需要任何其他库.

API函数

  • new X2JS() - 创建实例以访问所有库功能.您也可以在此处指定可选配置选项
  • X2JS.xml2json - 将指定为DOM Object的XML转换为JSON
  • X2JS.json2xml - 将JSON转换为XML DOM对象
  • X2JS.xml_str2json - 将指定为字符串的XML转换为JSON
  • X2JS.json2xml_str - 将JSON转换为XML字符串

在线演示http://jsfiddle.net/abdmob/gkxucxrj/1/

var x2js = new X2JS();
function convertXml2JSon() {
    $("#jsonArea").val(JSON.stringify(x2js.xml_str2json($("#xmlArea").val())));
}

function convertJSon2XML() {
    $("#xmlArea").val(x2js.json2xml_str($.parseJSON($("#jsonArea").val())));
}

convertXml2JSon();
convertJSon2XML();
$("#convertToJsonBtn").click(convertXml2JSon);
$("#convertToXmlBtn").click(convertJSon2XML);
Run Code Online (Sandbox Code Playgroud)


小智 23

这些答案帮助我做了很多这样的功能:

function xml2json(xml) {
  try {
    var obj = {};
    if (xml.children.length > 0) {
      for (var i = 0; i < xml.children.length; i++) {
        var item = xml.children.item(i);
        var nodeName = item.nodeName;

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

            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          obj[nodeName].push(xml2json(item));
        }
      }
    } else {
      obj = xml.textContent;
    }
    return obj;
  } catch (e) {
      console.log(e.message);
  }
}
Run Code Online (Sandbox Code Playgroud)

只要你传入一个jquery dom/xml对象:对我来说它是:

Jquery(this).find('content').eq(0)[0]
Run Code Online (Sandbox Code Playgroud)

其中,内容是我被存储我的XML领域.


Mas*_*ece 21

我创建了一个基于正则表达式的递归函数,以防您不想安装库并了解正在发生的事情背后的逻辑:

const xmlSample = '<tag>tag content</tag><tag2>another content</tag2><tag3><insideTag>inside content</insideTag><emptyTag /></tag3>';
console.log(parseXmlToJson(xmlSample));

function parseXmlToJson(xml) {
    const json = {};
    for (const res of xml.matchAll(/(?:<(\w*)(?:\s[^>]*)*>)((?:(?!<\1).)*)(?:<\/\1>)|<(\w*)(?:\s*)*\/>/gm)) {
        const key = res[1] || res[3];
        const value = res[2] && parseXmlToJson(res[2]);
        json[key] = ((value && Object.keys(value).length) ? value : res[2]) || null;

    }
    return json;
}
Run Code Online (Sandbox Code Playgroud)

每个循环的正则表达式解释:

  • res[0] - 返回 xml(按原样)
  • res[1] - 返回 xml 标签名称
  • res[2] - 返回 xml 内容
  • res[3] - 返回 xml 标签名称,以防标签自行关闭。在示例中:<tag />

您可以在此处检查正则表达式的工作原理: https ://regex101.com/r/ZJpCAL/1

注意:如果 json 有一个带有未定义值的键,它将被删除。这就是为什么我在第 9 行末尾插入了 null。


Neb*_*sar 5

我使用 xmlToJson 只是为了获取 xml 的单个值。
我发现执行以下操作要容易得多(如果 xml 仅出现一次..)

let xml =
'<person>' +
  ' <id>762384324</id>' +
  ' <firstname>Hank</firstname> ' +
  ' <lastname>Stone</lastname>' +
'</person>';

let getXmlValue = function(str, key) {
  return str.substring(
    str.lastIndexOf('<' + key + '>') + ('<' + key + '>').length,
    str.lastIndexOf('</' + key + '>')
  );
}


alert(getXmlValue(xml, 'firstname')); // gives back Hank
Run Code Online (Sandbox Code Playgroud)


小智 5

您还可以使用txml。它可以解析为由简单对象组成的 DOM 并进行字符串化。结果,内容将被修剪。因此,带有空格的原始格式将会丢失。但这可以很好地用来缩小 HTML。

const xml = require('txml');
const data = `
<tag>tag content</tag>
<tag2>another content</tag2>
<tag3>
  <insideTag>inside content</insideTag>
  <emptyTag />
</tag3>`;

const dom = xml(data); // the dom can be JSON.stringified

xml.stringify(dom); // this will return the dom into an xml-string
Run Code Online (Sandbox Code Playgroud)

免责声明:我是txml的作者,txml 是 javascript 中最快的 xml 解析器。