JavaScriptを使用してXMLをJSON(およびその逆)に変換する


145

XMLからJSONに変換してから、XMLに戻すにはどうすればよいでしょうか。

次のツールは非常にうまく機能しますが、完全に一貫しているわけではありません。

誰かが以前にこの状況に遭遇したことがありますか?


8
矛盾を説明してください
Josh Stodola

4
具体的には、要素が1つだけのJSON配列をXMLに変換する必要がありました。1要素の配列ではなく、JSONに変換すると、オブジェクトリテラルが作成されました。$ .isArray()で型をチェックし、!$。isArray()の場合は配列でラップすることで回避しました。
ジェイソン・スアレス

1
xml2json - fyneworks.com/jquery/xml-to-json -ブレークが15/02/2013 14:25 AESTのように500スロー
ysrb

json2xmlリンクが壊れています。
whirlwin

@ysrbプラグインの例はIE8では機能しません!

回答:


103

これが一番だと思います: XMLとJSONの間の変換

xml.com O'Reillyのサイトにある付随する記事を必ずお読みください。この記事では、これらの変換に関する問題について詳しく説明しています。O'Reillyがこの記事をホストしているという事実は、Stefanのソリューションにメリットがあることを示しているはずです。


返信いただきありがとうございます!私の場合、JSONは正規表現であり、XMLはXSLTに使用されているだけです。その使用は私の考えではありません!:)
ジェイソン・スアレス

これはブラウザのみです。node.jsまたは非ブラウザー環境には適用されません。他のアイデアはありますか?
Homer6、2013年

1
彼の投稿への@JasonDenizacコメントに関して、このリンクが1つの項目の配列の代わりにオブジェクトを持つ問題を修正するのにどのように役立つかわかりません...
guiomie

1
json-xml-jsonから開始すると、このライブラリはうまく機能しますが、xml-json-xmlが必要な場合、<o>や<e>などのメタデータxml要素が追加されるため、可逆性に問題があります
vishr

3
これはコピーレフトライセンスソリューションであることに注意してください。これは、オープンソースソフトウェアを作成する場合の唯一のオプションです。
Jasper 2014年

48

https://github.com/abdmob/x2js-自分のライブラリ(http://code.google.com/p/x2js/からの更新されたURL ):

このライブラリは、XMLからJSON(JavaScriptオブジェクト)へ、およびその逆の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
こんにちは、オブジェクトにオブジェクトが1つある場合、それがオブジェクトリテラルであり、n> 1のオブジェクトがある場合、配列があるという問題をどのように克服しましたか。これにより、テンプレート内のjsonオブジェクトにxmlを使用することが困難になります...
guiomie

はい、あなたはいくつかのトリックを使用する必要があり、それはXML構造についてのあなたの知識に依存します(ここにはXSDがないため)。<node> ... <node> _asArray構文を使用して、常に配列(シーケンス)としてノードにアクセスします
abdolence

1
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]);
崇拝

私の主な問題は、jsonをxmlに変換し直すと、jsonに追加のプロパティがいっぱいになることと、文字列xmlバージョンがすべての不要なものを保持することです。すべての種類のカンマと空白が含まれています...
guiomie 2013

サンプルをcode.google.com/p/x2js/issuesに送信していただけませんか。確認します
禁欲

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に再作成するライブラリ。機能:-jsonオブジェクトにXMLを解析します。jsonオブジェクトをxmlに出力します。XMLをX2JオブジェクトとしてIndexedDBに保存するために使用できます。jsonオブジェクトを印刷します。


@kleopatraこのリンクは、xmlをjsonに変換するツールを指します。これは参照ではなく、リソースへの実際のリンクです。他にどのようにすべきかわからない:)
スーリヤ

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 repoが見つかりません
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コンバーター以上のものです。readmeを確認してください。
Amit Kumar Gupta

1

ここに、xml <-> js変換を非常にうまく行う、文書化された非常に有名なnpmライブラリの優れたツールがあります。上記の提案されたソリューションの一部(おそらくすべて)とは異なり、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                                                                                                                                                              
}  

https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6echo "xml2json_example()" | node -r xml2json.es6でソースを使用してテストする


0

xmlの単一の値を取得するためだけにxmlToJsonを使用していました。
以下を実行する方がはるかに簡単であることがわかりました(xmlが1回しか発生しない場合)。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.