Конвертировать XML в JSON (и обратно), используя Javascript

145

Как бы вы конвертировали из XML в JSON, а затем обратно в XML?

Следующие инструменты работают довольно хорошо, но не полностью согласованы:

Кто-нибудь сталкивался с такой ситуацией раньше?

Джейсон Суарес
источник
8
Объясните несоответствия, пожалуйста
Джош Стодола
4
В частности, это было связано с преобразованием массивов 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!
чувак

Ответы:

103

Я думаю, что это лучший: конвертация между XML и JSON

Обязательно ознакомьтесь с сопроводительной статьей на сайте xml.com O'Reilly , в которой подробно рассматриваются проблемы, связанные с этими конверсиями, которые, я думаю, вы найдете полезными. Тот факт, что О'Рейли ведет эту статью, должен указывать на то, что решение Стефана имеет свои достоинства.

Джош Стодола
источник
Спасибо за ответ! В моем случае JSON - это каноническое представление, а XML используется только для XSLT ... использование которого не является моей идеей! :)
Джейсон Суарес
Это только в браузере. Не применяется для node.js или не браузерных сред. Есть другие идеи?
Homer6
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 функции

  • new 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);
abdolence
источник
1
Привет, как вы преодолели проблему, когда, если у вас есть один объект в объекте, он находится в литеральном объекте, где, если есть n> 1 объектов, у вас есть массив. Это затрудняет использование xml для json объектов в шаблонах ...
guiomie
Да, вы должны использовать некоторую хитрость, и это зависит от ваших знаний о структуре XML (потому что здесь нет XSD). Используйте синтаксис <node> ... <node> _asArray, чтобы всегда получать доступ к вашему узлу в виде массива (последовательности)
абдуланс
1
Пример: // XML-строка в JSON var xmlText = "<MyOperation> <test> Success </ test> <test2> <item> ddsfg </ item> <item> dsdgfdgfd </ item> </ test2> </ MyOperation> «; var jsonObj = X2JS.xml_str2json (xmlText); alert (jsonObj.MyOperation.test); alert (jsonObj.MyOperation.test_asArray [0]);
взрослая жизнь
Моя главная проблема, когда я преобразую свой 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 для своего приложения TV Watchlist, надеюсь, это тоже поможет.

Synopsys: библиотека, которая не только конвертирует xml в json, но также легко отлаживается (без циклических ошибок) и воссоздает json обратно в xml. Особенности: - Разбор XML для JSON объекта. Вывести объект json обратно в xml. Может использоваться для сохранения XML в IndexedDB в качестве объектов X2J. Распечатать объект 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 репо не найдено
браулиобо
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);
Амит Кумар Гупта
источник
: 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);
SimoneMSR
источник
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

brauliobo
источник
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

Nebulosar
источник
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.

Шедевр
источник
-2

Лучший способ сделать это, используя сторону сервера, так как сторона клиента не работает хорошо во всех сценариях. Я пытался создать онлайн-конвертер json в xml и xml в json, используя javascript, и я чувствовал себя почти невозможным, так как он работал не во всех сценариях. В конечном итоге я сделал это на стороне сервера, используя Newtonsoft в ASP.MVC. Вот онлайн-конвертер http://techfunda.com/Tools/XmlToJson

Шео Нараян
источник