#javascript #node.js
#javascript #jquery #xml #json #форматирование-преобразование
Вопрос:
Как бы вы преобразовали XML в JSON, а затем обратно в XML?
Следующие инструменты работают довольно хорошо, но не являются полностью согласованными:
Кто-нибудь сталкивался с такой ситуацией раньше?
Комментарии:
1. Объясните несоответствия, пожалуйста
2. В частности, это было связано с преобразованием массивов JSON, содержащих всего 1 элемент, в XML. Когда вы преобразовали его обратно в JSON, вместо массива из 1 элемента был создан литерал объекта. Я обошел это, проверив тип с помощью $.isArray() и обернув его в массив, если! $.isArray() .
3. xml2json — fyneworks.com/jquery/xml-to-json — брейки-броски 500 по состоянию на 15/02/2013 14:25 по восточному времени
4. Ссылка json2xml не работает.
5. @ysrb Пример плагина не будет работать в IE8!
Ответ №1:
Я думаю, что это лучший вариант: преобразование между XML и JSON
Обязательно прочитайте сопроводительную статью о xml.com Сайт О’Рейли, в котором подробно описываются проблемы с этими конверсиями, которые, я думаю, вы найдете поучительными. Тот факт, что О’Рейли размещает статью, должен указывать на то, что решение Стефана заслуживает внимания.
Комментарии:
1. спасибо за ответ! В моем случае JSON является каноническим представлением, а XML используется только для XSLT .. использование которого — не моя идея! 🙂
2. Это только в браузере. Не применяется для node.js или среды, не связанные с браузером. Есть еще идеи?
3. Что касается комментария @JasonDenizac к его сообщению, я не уверен, что понимаю, как эта ссылка помогает решить проблему наличия объекта вместо массива из одного элемента…
4. Я обнаружил, что если вы начинаете с json-xml-json, эта библиотека работает хорошо, но если вы хотите xml-json-xml, возникает проблема с обратимостью, поскольку она добавляет элементы xml метаданных, такие как <o> и <e>
5. Пожалуйста, обратите внимание, что это лицензионное решение с авторским левым. Это возможно только при написании программного обеспечения с открытым исходным кодом.
Ответ №2:
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. Привет, как вы преодолели проблему, из-за которой, если у вас есть один объект в объекте, он находится в object litteral, где, если существует n> 1 объектов, у вас есть массив. Это затрудняет использование xml для объектов json в шаблонах…
2. Да, вы должны использовать какой-то трюк, и это зависит от ваших знаний о структуре XML (потому что здесь нет XSD). Используйте синтаксис <node> …<node>_asArray для доступа к вашему узлу всегда в виде массива (последовательности)
3. Пример:// XML string в JSON var XmlText = «<MyOperation><test>Success</test><test2><item>ddsfg</item><item>dsdgfdgfd</item></test2></MyOperation>» ; переменная jsonObj = X2JS.xml_str2json( XmlText); оповещение (jsonObj. myOperation.test); оповещение (jsonObj. myOperation.test_asArray[0]);
4. Моя главная проблема заключается в том, что когда я преобразую свой json обратно в xml, json полон дополнительных свойств, а когда строковая версия xml сохраняет все бесполезные вещи. В нем есть все виды запятых и пробелов…
5. не могли бы вы отправить свой образец в code.google.com/p/x2js/issues Я проверю это
Ответ №3:
Эти ответы очень помогли мне создать эту функцию:
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.
Комментарии:
1. спас мой день! Почти все остальные примеры не работают, даже примеры JSFiddle!
Ответ №4:
Я создал рекурсивную функцию, основанную на регулярном выражении, на случай, если вы не хотите устанавливать библиотеку и понимать логику происходящего:
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] amp;amp; parseXmlToJson(res[2]);
json[key] = ((value amp;amp; 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 имеет ключ с неопределенным значением, он удаляется. Вот почему я вставил null в конец строки 9.
Комментарии:
1. Не работает должным образом с глубокими вложенными строковыми значениями xml.
2. @sankarmuniyappa пожалуйста, напишите пример, который не сработал, поэтому я его исправлю 🙂
Ответ №5:
Некоторое время назад я написал этот инструмент https://bitbucket.org/surenrao/xml2json надеюсь, это тоже поможет для приложения My TV Watchlist.
Synopsys: библиотека не только для преобразования xml в json, но и для простой отладки (без циклических ошибок) и воссоздания json обратно в xml. Особенности : — Преобразование xml в объект json. Распечатайте объект json обратно в xml. Может использоваться для сохранения xml в IndexedDB в виде объектов X2J. Печать объекта json.
Комментарии:
1. @kleopatra эта ссылка указывает на инструмент, который преобразует xml в json. Это не ссылка, а фактическая ссылка на ресурс. Не уверен, как еще я должен это сделать 🙂
Ответ №6:
Вы также можете использовать txml. Он может преобразовываться в DOM, состоящий из простых объектов, и stringify. В результате содержимое будет обрезано. Таким образом, форматирование оригинала с пробелами будет потеряно. Но это можно было бы очень хорошо использовать для минимизации 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
Отказ от ответственности: я являюсь автором txml, самого быстрого синтаксического анализатора xml в javascript.
Комментарии:
1. 👍 Это отличная замена для
fast-xml-parser
использованияsimplify
, которая не преобразует строки в числа произвольно (например"1.0"
, в1
или1.
)
Ответ №7:
Я использовал 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
Комментарии:
1. Продолжайте в том же духе! Это определенно помогло мне!
2. Большое вам спасибо за поддержку 🙂
3. Никаких проблем!!! БД
Ответ №8:
Отказ от ответственности: я написал fast-xml-parser
Быстрый анализатор 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);
Комментарии:
1. : D FXP — это больше, чем конвертер XML 2 JSON. Пожалуйста, проверьте, что это readme.
Ответ №9:
Вот хороший инструмент из документированной и очень известной библиотеки npm, который очень хорошо выполняет преобразования xml <-> js: в отличие от некоторых (возможно, всех) из предложенных выше решений, он также преобразует комментарии xml.
var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
Ответ №10:
Я бы лично рекомендовал этот инструмент. Это конвертер 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”}}’
Вот онлайн-демонстрация!
Комментарии:
1. репозиторий github не найден
Ответ №11:
В 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
Комментарии:
1. 6 простых строк, плюс 2000 строк из
xml2json
2. @ShortFuse единственная зависимость — это xmldom, анализатор xml. при этом не используется xml2json из npm, хотя имя то же самое
Ответ №12:
Лучший способ сделать это, используя серверную часть в качестве клиентской, не работает хорошо во всех сценариях. Я пытался создать онлайн-конвертер json в xml и xml в json с помощью javascript, и я чувствовал себя почти невозможным, поскольку это работало не во всех сценариях. В конечном счете я закончил тем, что сделал это на стороне сервера, используя Newtonsoft в ASP.MVC. Вот онлайн-конвертер http://techfunda.com/Tools/XmlToJson