160

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

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

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

4

12 に答える 12

115

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

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

于 2009-11-20T22:11:57.703 に答える
55

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);
于 2011-12-09T13:22:50.493 に答える
9

ライブラリをインストールしたくない場合や、何が起こっているかの背後にあるロジックを理解したくない場合に備えて、正規表現に基づいて再帰関数を作成しました。

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 を挿入しました。

于 2020-05-04T13:47:08.840 に答える
4

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

免責事項: 私は、javascript で最速の xml パーサーであるtxmlの作成者です。

于 2020-08-25T10:26:37.200 に答える
1

xmlToJson を使用して、xml の単一の値を取得していました。
次のことを行う方がはるかに簡単であることがわかりました(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

于 2019-06-21T10:24:12.947 に答える
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                                                                                                                                                              
}  

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

于 2019-11-12T20:49:08.250 に答える
-4

サーバー側をクライアント側として使用する最善の方法は、すべてのシナリオでうまく機能するとは限りません。javascriptを使用してオンラインのjsonからxmlへ、およびxmlからjsonへのコンバーターを構築しようとしていましたが、すべてのシナリオで機能していないため、ほとんど不可能だと感じました。最終的に、ASP.MVC で Newtonsoft を使用してサーバー側で実行することになりました。ここにオンラインコンバータがありますhttp://techfunda.com/Tools/XmlToJson

于 2015-06-05T15:34:08.017 に答える