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

时间:2009-11-20 22:06:54

标签: javascript jquery xml json format-conversion

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

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

以前是否有人遇到过这种情况?

13 个答案:

答案 0 :(得分:89)

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

请务必阅读accompanying article on the xml.com O'Reilly site,其中详细介绍了这些转化的问题,我认为您会发现这些转化具有启发性。 O'Reilly主持该文章的事实应该表明Stefan的解决方案具有优点。

答案 1 :(得分:44)

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

  

此库提供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);

答案 2 :(得分:20)

这些答案帮助我完成了这项工作:

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的字段。

答案 3 :(得分:3)

前段时间我为我的电视监视列表应用编写了这个工具https://bitbucket.org/surenrao/xml2json,希望这也有帮助。

  

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

答案 4 :(得分:3)

我个人推荐this tool。它是一个XML to JSON转换器。

它非常轻量级,采用纯JavaScript。它不需要依赖。您只需将函数添加到代码中并根据需要使用它。

它还考虑了XML属性。

handleResponse: function() {
  //Push data to options...
},

这是一个online demo

答案 5 :(得分:2)

您也可以使用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

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

答案 6 :(得分:1)

免责声明:我写过fast-xml-parser

Fast XML Parser可以帮助将XML转换为JSON,反之亦然。这是一个例子;

var options = {
    attributeNamePrefix : "@_",
    attrNodeName: "attr", //default is 'false'
    textNodeName : "#text",
    ignoreAttributes : true,
    ignoreNameSpace : false,
    allowBooleanAttributes : false,
    parseNodeValue : true,
    parseAttributeValue : false,
    trimValues: true,
    decodeHTMLchar: false,
    cdataTagName: "__cdata", //default is 'false'
    cdataPositionChar: "\\c",
};
if(parser.validate(xmlData)=== true){//optional
    var jsonObj = parser.parse(xmlData,options);
}

如果要将JSON或JS对象解析为XML,那么

//default options need not to set
var defaultOptions = {
    attributeNamePrefix : "@_",
    attrNodeName: "@", //default is false
    textNodeName : "#text",
    ignoreAttributes : true,
    encodeHTMLchar: false,
    cdataTagName: "__cdata", //default is false
    cdataPositionChar: "\\c",
    format: false, 
    indentBy: "  ",
    supressEmptyNode: false
};
var parser = new parser.j2xParser(defaultOptions);
var xml = parser.parse(json_or_js_obj);

答案 7 :(得分:1)

Here'是一个很好的工具,它来自一个有记录的非常著名的npm库,可以很好地完成xml <-> js转换:与上述(某些)解决方案不同,它还可以转换xml注释

var obj = {name: "Super", Surname: "Man", age: 23};

var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);

答案 8 :(得分:1)

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

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的原因。

答案 9 :(得分:0)

我使用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 Henk

答案 10 :(得分:0)

在6条简单的ES6行中:

xml2json = xml => {                                                                                                                                                     
  var el = xml.nodeType === 9 ? xml.documentElement : xml                                                                                                               
  var h  = {name: el.nodeName}                                                                                                                                          
  h.content    = Array.from(el.childNodes || []).filter(e => e.nodeType === 3).map(e => e.textContent).join('').trim()                                                  
  h.attributes = Array.from(el.attributes || []).filter(a => a).reduce((h, a) => { h[a.name] = a.value; return h }, {})                                                 
  h.children   = Array.from(el.childNodes || []).filter(e => e.nodeType === 1).map(c => h[c.nodeName] = xml2json(c))                                                    
  return h                                                                                                                                                              
}  

使用echo "xml2json_example()" | node -r xml2json.es6进行测试,源代码为https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6

答案 11 :(得分:0)

Xml-to-json 库有方法 jsonToXml(json) 和 xmlToJson(xml)。 https://utilities-online.info/xmltojson 使用了它。

答案 12 :(得分:-1)

使用服务器端作为客户端进行此操作的最佳方法在所有方案中都不能很好地工作。我试图使用javascript在线构建json到xml和xml到json转换器,我感觉几乎不可能,因为它不适用于所有场景。最终,我最终在ASP.MVC中使用Newtonsoft进行服务器端。这是在线转换器http://techfunda.com/Tools/XmlToJson