2009-11-20 1 views
98

Как бы вы конвертировали из XML в JSON, а затем обратно в XML?Преобразование XML в JSON (и обратно) с помощью Javascript

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

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

+6

Объясните несоответствия, пожалуйста –

+3

В частности, должен был сделать с преобразованием JSON массива с помощью всего 1 элемента XML. Когда вы преобразовали его обратно в JSON, вместо массива из 1 элемента, он создал литерал объекта. Я работал над ним, проверяя тип с $ .isArray() и обертывая его в массив if! $. IsArray(). –

+1

xml2json - http://www.fyneworks.com/jquery/xml-to-json/ - breaks throws 500 от 15.02.2012 14:25 AEST – ysrb

ответ

77

Я думаю, что это лучший один: Converting between XML and JSON

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

+0

благодарит за ответ! В моем случае JSON является каноническим представлением, а XML просто используется для XSLT .. использование которого не является моей идеей! :) –

+0

Это только в браузере. Не применяется для сред node.js или без браузера. Любые другие идеи? – Homer6

+1

Что касается комментария @JasonDenizac к его сообщению, я не уверен, что понимаю, как эта ссылка помогает исправить проблему наличия объекта вместо массива одного элемента ... – guiomie

34

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

Эта библиотека предоставляет XML в JSON (JavaScript объекты) и наоборот Javascript функции преобразования. Библиотека очень маленькая и не требует каких-либо других дополнительных библиотек.

API функция

  • новых X2() - создать экземпляр для доступа ко всей библиотеке функциональных возможностей. Также можно указать дополнительные параметры конфигурации здесь
  • X2JS.xml2json - Преобразование XML, указанный в качестве DOM объекта в JSON
  • X2JS.json2xml - Преобразование JSON в XML DOM объект
  • X2JS.xml_str2json - Преобразование XML, указанный в качестве строки в формате JSON
  • X2JS.json2xml_str - Преобразование JSON в строку XML

Online Demo на 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

Привет, как вы преодолели проблему, если у вас есть один объект в объекте, который находится в объекте litteral, где, если есть n> 1 объект, у вас есть массив. Это затрудняет использование объектов xml для json в шаблонах ... – guiomie

+0

Да, вы должны использовать какой-то трюк, и это зависит от ваших знаний о структуре XML (потому что здесь нет XSD). Использовать ... _asArray синтаксис для доступа к вашему узлу всегда в качестве массива (последовательности) – abdolence

+1

Пример: // XML-строку JSON уаг xmlText = " Успех ddsfg dsdgfdgfd"; var jsonObj = X2JS.xml_str2json (xmlText); alert (jsonObj.MyOperation.test); alert (jsonObj.MyOperation.test_asArray [0]); – abdolence

2

A while back Я написал этот инструмент https://bitbucket.org/surenrao/xml2json для моего приложения Watch Watch TV, надеюсь, что это тоже поможет.

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

+0

@kleopatra эта ссылка указывает на инструмент, который преобразует xml в json. Это не ссылка, а фактическая ссылка на ресурс. Не знаю, как еще я должен это сделать :) – surya

+0

hach ​​.. не прочитал вопрос - хороший краткий обзор :-) – kleopatra

14

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

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 йот/объекта XML: для меня это было:

Jquery(this).find('content').eq(0)[0] 

где содержание было полем, в котором я хранил свой xml.

-1

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

4

Я лично рекомендовал бы this tool. Это конвертер 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”}}’ 

Адрес online demo!

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);