Перетворення XML в JSON (і назад) за допомогою Javascript


145

Як би ви конвертували з XML в JSON і потім поверталися до XML?

Наведені нижче інструменти працюють досить добре, але не повністю відповідають:

Хтось раніше стикався з цією ситуацією?


8
Поясніть невідповідності, будь ласка
Джош Стодола

4
Зокрема, це стосувалося перетворення масивів JSON лише з 1 елементом у XML. Коли ви перетворили його назад у JSON, замість масиву з 1 елементом він створив об'єкт буквально. Я працював навколо нього, перевіряючи тип з $ .isArray () і загортаючи його в масив, якщо! $. IsArray ().
Джейсон Суарес

1
xml2json - fyneworks.com/jquery/xml-to-json - перерви кидає 500 станом на
02.02.2013

Посилання json2xml розірвано.
вихор

@ysrb Приклад плагіна не працюватиме в IE8!
чувак

Відповіді:


103

Я думаю, що це найкраще: конвертування між XML та JSON

Не забудьте прочитати супровідну статтю на сайті xml.com O'Reilly , де викладені деталі проблем із цими перетвореннями, які, на мою думку, ви знайдете освічуючими. Те, що О'Рейлі приймає статтю, повинно свідчити про те, що рішення Стефана має заслугу.


Дякую за відповідь! У моєму випадку JSON є канонічним представленням, а XML просто використовується для XSLT .. використання якого - не моя ідея! :)
Джейсон Суарес

Це лише в браузері. Не застосовується для node.js або середовищ, які не є браузером. Будь-які інші ідеї?
Гомер6

1
Що стосується коментаря до @JasonDenizac до його повідомлення, я не впевнений, що розумію, як це посилання допомагає виправити проблему наявності об’єкта замість масиву одного елемента ...
guiomie

1
Я виявив, що якщо ви почнете з json-xml-json, ця бібліотека працює добре, але якщо ви хочете, щоб xml-json-xml виникла проблема з оборотністю, оскільки вона додає метадані xml елементи, такі як <o> та <e>
vishr

3
Зверніть увагу, що це ліцензійне рішення для копілефт. Це лише варіант, коли ви пишете програмне забезпечення з відкритим кодом.
Джаспер

48

https://github.com/abdmob/x2js - моя власна бібліотека (оновлена ​​URL-адреса з http://code.google.com/p/x2js/ ):

Ця бібліотека забезпечує XML в JSON (JavaScript Об'єкти) і навпаки функції перетворення JavaScript. Бібліотека дуже мала і не потребує інших додаткових бібліотек.

Функції API

  • новий X2JS () - створити свій примірник для доступу до всіх функцій бібліотеки. Тут також можна вказати додаткові параметри конфігурації
  • X2JS.xml2json - Перетворити XML, вказаний як DOM-об'єкт в 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

Так, вам слід скористатися деякою хитрістю, і це залежить від ваших знань про структуру XML (адже тут немає XSD). Використовуйте <node> ... <node> _asArray синтаксис для доступу до вашого вузла завжди як масив (послідовність)
відступ

1
Зразок: // рядок 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]);
жорстокість

Моя основна проблема - коли я перетворюю свій json на xml назад, json сповнений додаткових властивостей, і коли версія xml-рядка зберігає всі непотрібні речі. У ньому є всілякі коми і пробіли ...
guiomie

чи можете ви надіслати свій зразок на code.google.com/p/x2js/isissue Я перевірю це
жорстокість

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. Може використовуватися для збереження xml у IndexedDB як X2J-об’єкти. Роздрукувати об’єкт json.


@kleopatra це посилання вказує на інструмент, який перетворює xml у json. Це не посилання, а фактичне посилання на ресурс. Не знаю, як інакше мені це робити :)
surya

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

Відмова: Я написав швидкий аналізатор xml

Швидкий 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.
Аміт Кумар Гупта

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.es6джерелом на https://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;
}

Пояснення Regex для кожного циклу:

  • res [0] - повернути xml (як є)
  • res [1] - повернення імені тега xml
  • res [2] - повернення вмісту xml
  • res [3] - поверніть ім'я тега xml у випадку, якщо тег закриється сам. Наприклад:<tag />

Ви можете перевірити, як працює регекс тут: https://regex101.com/r/ZJpCAL/1

Примітка. Якщо у json є ключ із невизначеним значенням, він видаляється. Тому я вставив null в кінці рядка 9.


-2

Найкращий спосіб зробити це за допомогою сервера, оскільки сторона клієнта не працює добре у всіх сценаріях. Я намагався створити онлайн-json до xml та xml до json-конвертер за допомогою JavaScript, і мені стало майже неможливо, оскільки він працював не у всіх сценаріях. Врешті-решт я зробив це на сервері за допомогою Newtonsoft в ASP.MVC. Ось онлайн-конвертер http://techfunda.com/Tools/XmlToJson

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.