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

IT技术 javascript jquery xml json format-conversion
2021-01-20 14:16:16

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

以下工具工作得很好,但并不完全一致:

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

6个回答

我认为这是最好的: Converting between XML and JSON

请务必阅读xml.com O'Reilly 站点上随附的文章,其中详细介绍了这些转换的问题,我认为您会从中得到启发。O'Reilly 主持这篇文章的事实应该表明 Stefan 的解决方案是有value的。

请注意,这是一个 Copyleft 许可的解决方案。这只是您编写开源软件时的一种选择。
2021-03-10 14:16:16
关于@JasonDenizac 对他的帖子的评论,我不确定这个链接如何帮助解决拥有一个对象而不是一个项目数组的问题......
2021-03-16 14:16:16
这仅在浏览器中。不适用于 node.js 或非浏览器环境。还有其他想法吗?
2021-03-17 14:16:16
谢谢回复!就我而言,JSON 是规范表示,而 XML 仅用于 XSLT .. 使用它不是我的想法!:)
2021-03-25 14:16:16
我发现如果你从 json-xml-json 开始,这个库运行良好,但如果你想要 xml-json-xml 有可逆性问题,因为它添加了元数据 xml 元素,如 <o> 和 <e>
2021-04-03 14:16:16

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

该库提供 XML 到 JSON(JavaScript 对象),反之亦然 javascript 转换功能。该库非常小,不需要任何其他额外的库。

API函数

  • new X2JS() - 创建您的实例以访问所有库功能。您也可以在此处指定可选配置选项
  • X2JS.xml2json - 将指定为 DOM 对象的 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);
Sample:// XML 字符串到 JSON var xmlText = "<MyOperation><test>Success</test><test2><item>ddsfg</item><item>dsdgfdgfd</item></test2></MyOperation> ”;var jsonObj = X2JS.xml_str2json( xmlText); 警报(jsonObj.MyOperation.test);警报(jsonObj.MyOperation.test_asArray[0]);
2021-03-11 14:16:16
我的主要问题是,当我将 json 转换回 xml 时,json 充满了额外的属性,而当字符串 xml 版本保留了所有无用的东西时。它有各种逗号和空格...
2021-03-22 14:16:16
你能把你的样本提交到code.google.com/p/x2js/issues我会检查一下
2021-03-24 14:16:16
是的,您应该使用一些技巧,这取决于您对 XML 结构的了解(因为这里没有 XSD)。使用 <node>...<node>_asArray 语法始终以数组(序列)的形式访问您的节点
2021-03-26 14:16:16
嗨,你是如何克服这个问题的,如果一个对象中有一个对象,它就在对象字面量中,如果有 n > 1 个对象,你有一个数组。这使得很难在模板中使用 xml 到 json 对象......
2021-04-06 14:16:16

这些答案对我完成此功能有很大帮助:

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);
  }
}

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

Jquery(this).find('content').eq(0)[0]

其中content是我存储 xml 的字段。

不久前,我为我的 TV Watchlist 应用编写了这个工具https://bitbucket.org/surenrao/xml2json,希望这也能有所帮助。

Synopsys:一个库,不仅可以将 xml 转换为 json,而且还易于调试(没有循环错误)并将 json 重新创建回 xml。特点:- 将 xml 解析为 json 对象。将 json 对象打印回 xml。可用于将 IndexedDB 中的 xml 保存为 X2J 对象。打印 json 对象。

@kleopatra 此链接指向将 xml 转换为 json 的工具。它不是参考,而是资源的实际链接。不知道我还应该怎么做:)
2021-03-13 14:16:16

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

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;
}

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

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

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

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

这是太棒了。像魅力一样工作!
2021-04-02 14:16:16