使用Javascript将XML转换为JSON(并反向转换)


145

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

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

有人遇到过这种情况吗?


8
请解释不一致之处
Josh Stodola,

4
具体来说,与仅将1个元素的JSON数组转换为XML有关。当您将其转换回JSON而不是1元素数组时,它创建了对象文字。我通过使用$ .isArray()检查类型并将其包装在数组中(如果是$ .isArray())来解决该问题。
贾森·苏亚雷斯

1
xml2json - fyneworks.com/jquery/xml-to-json -符抛出500为15/02/2013 14:25 AEST的
ysrb

json2xml链接已损坏。
whirlwin

@ysrb该插件示例在IE8中不起作用!
dude 2014年

Answers:


103

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

一定要阅读xml.com O'Reilly网站上随附文章,该文章详细介绍了这些转换所带来的问题,我认为您会发现这很有启发性。O'Reilly托管该文章的事实应表明,Stefan的解决方案值得。


谢谢回复!就我而言,JSON是规范表示,而XML仅用于XSLT ..使用它不是我的想法!:)
贾森·苏亚雷斯

这仅在浏览器中。不适用于node.js或非浏览器环境。还有其他想法吗?
Homer6

1
关于@JasonDenizac对他的帖子的评论,我不确定该链接如何帮助解决使用对象而不是一个项的数组的问题……
guiomie

1
我发现,如果您从json-xml-json开始,则该库运行良好,但是如果您希望xml-json-xml,则可逆性存在问题,因为它添加了<o>和<e>等元数据xml元素
vishr

3
请注意,这是一个copyleft许可的解决方案。这是在编写开源软件时的唯一选择。
Jasper 2014年

48

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

该库提供XML到JSON(JavaScript对象)的功能,反之亦然。该库很小,不需要其他任何库。

API函数

  • 新的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);

1
嗨,您是如何克服以下问题的:如果一个对象中有一个对象,则该对象位于对象侧面;如果n> 1个对象,则有一个数组。这使得很难在模板中使用xml来存储json对象...
guiomie 2013年

是的,您应该使用一些技巧,这取决于您对XML结构的了解(因为此处没有XSD)。使用<node> ... <node> _asArray语法始终以数组(序列)的形式访问您的节点
停滞

1
Sample:// XML字符串转换为JSON var xmlText =“ <MyOperation> <test>成功</ test> <test2> <item> ddsfg </ item> <item> dsdgfdgfd </ item> </ test2> </ MyOperation> “; var jsonObj = X2JS.xml_str2json(xmlText); 警报(jsonObj.MyOperation.test); 警报(jsonObj.MyOperation.test_asArray [0]);
b念

我的主要问题是,当我将json转换回xml时,json充满了额外的属性,而字符串xml版本保留了所有无用的东西。它具有各种逗号和空格...
guiomie

您能否将您的示例提交到code.google.com/p/x2js/issues,我将进行检查
-abdolence

25

这些答案对我实现此功能很有帮助:

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]

内容是我存储xml的字段所在的位置。


3

不久前,我为电视监视列表应用程序编写了此工具https://bitbucket.org/surenrao/xml2json,希望这也能有所帮助。

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


@kleopatra此链接指向将xml转换为json的工具。它不是参考,而是指向资源的实际链接。不知道我应该怎么做:)
surya 2013年

2

我个人会推荐这个工具。这是一个XML到JSON的转换器。

它非常轻巧,采用纯JavaScript。它不需要依赖。您可以简单地将功能添加到代码中,然后根据需要使用它。

它还考虑了XML属性。

var xml = ‘<person id=”1234 age=”30”><name>John Doe</name></person>’;
var json = xml2json(xml); 

console.log(json); 
// prints ‘{“person”: {“id”: “1234”, “age”: “30”, “name”: “John Doe”}}’

这是一个在线演示


4
找不到github存储库
brauliobo

1

免责声明:我已经写了fast-xml-parser

快速XML解析器可以帮助将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);

:D FXP不仅仅是XML 2 JSON转换器。请检查它的自述文件。
阿米特·库玛·古普塔

1

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

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

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

1

在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.es6https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6中使用源进行测试


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 Hank


0

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

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


-2

使用服务器端作为客户端的最佳方法并不是在所有情况下都能正常工作。我试图使用JavaScript将在线json转换为xml,并将xml转换为json转换器,但由于无法在所有情况下都无法正常工作,我感到几乎不可能。最终,我最终在ASP.MVC中使用Newtonsoft在服务器端完成了此工作。这是在线转换器http://techfunda.com/Tools/XmlToJson

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.