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

120

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

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

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

  • 7
    Объясните несоответствия, пожалуйста
  • 3
    В частности, это было связано с преобразованием массивов JSON с одним элементом в XML. Когда вы преобразовали его обратно в JSON, вместо массива из 1 элемента он создал литерал объекта. Я обошел его, проверив тип с помощью $ .isArray () и обернув его в массив, если! $. IsArray ().
Показать ещё 3 комментария
Теги:
format-conversion

8 ответов

86
Лучший ответ

Я думаю, что это лучший вариант: Преобразование между XML и JSON

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

  • 0
    Спасибо за ответ! В моем случае JSON - это каноническое представление, а XML используется только для XSLT ... использование которого не является моей идеей! :)
  • 0
    Это только в браузере. Не применяется для node.js или не браузерных сред. Есть другие идеи?
Показать ещё 8 комментариев
42

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 - Преобразование объекта DOM XML в XML
  • 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 объектов в шаблонах ...
  • 0
    Да, вы должны использовать некоторую хитрость, и это зависит от ваших знаний о структуре XML (потому что здесь нет XSD). Используйте синтаксис <node> ... <node> _asArray для доступа к вашему узлу всегда в виде массива (последовательности)
Показать ещё 8 комментариев
15

Эти ответы помогли мне сделать эту функцию:

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.

  • 0
    хорошо, но недостающие атрибуты
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"}}’

Здесь онлайн-демонстрация!

2

А назад я написал этот инструмент https://bitbucket.org/surenrao/xml2json для моего приложения TV Watchlist, надеюсь, что это тоже поможет.

Synopsys: библиотека, которая не только конвертирует xml в json, но также легко отлаживает (без круговых ошибок) и воссоздает json обратно в xml. Особенности: - Разбить xml на json-объект. Верните объект json обратно в xml. Может использоваться для сохранения xml в IndexedDB как объекты X2J. Печать объекта json.

  • 0
    @kleopatra эта ссылка указывает на инструмент, который преобразует XML в JSON. Это не ссылка, а фактическая ссылка на ресурс. Не уверен, как еще я должен это сделать :)
  • 0
    ха-ха .. не читал вопрос - хороший конспект :-)
0

Вот хороший инструмент из документированной и очень известной библиотеки npm, которая очень хорошо выполняет преобразования xml <-> js: в отличие от некоторых (возможно, всех) предложенных выше решений, она также конвертирует комментарии xml.

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

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

Отказ от ответственности: я написал 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);
  • 0
    вместо одной страницы кода у вас так много файлов?
  • 0
    : D FXP - это больше, чем XML 2 JSON конвертер. Пожалуйста, проверьте это readme.
-3

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню