Como você converteria de XML para JSON e depois retornaria para XML?
As seguintes ferramentas funcionam muito bem, mas não são completamente consistentes:
Alguém já encontrou essa situação antes?
Como você converteria de XML para JSON e depois retornaria para XML?
As seguintes ferramentas funcionam muito bem, mas não são completamente consistentes:
Alguém já encontrou essa situação antes?
Respostas:
Eu acho que este é o melhor: Convertendo entre XML e JSON
Certifique-se de ler o artigo que acompanha o site xml.com O'Reilly , que detalha os problemas dessas conversões, que acho que você achará esclarecedor. O fato de O'Reilly hospedar o artigo deve indicar que a solução de Stefan tem mérito.
https://github.com/abdmob/x2js - minha própria biblioteca (URL atualizado de http://code.google.com/p/x2js/ ):
Esta biblioteca fornece XML para JSON (JavaScript Objects) e vice-versa funções de conversão de javascript. A biblioteca é muito pequena e não requer outras bibliotecas adicionais.
Funções de API
- novo X2JS () - para criar sua instância para acessar todas as funcionalidades da biblioteca. Além disso, você pode especificar opções de configuração opcionais aqui
- X2JS.xml2json - Converter XML especificado como Objeto DOM em JSON
- X2JS.json2xml - Converter objeto JSON em XML DOM
- X2JS.xml_str2json - Converte XML especificado como string em JSON
- X2JS.json2xml_str - Converte uma string JSON para XML
Demonstração on-line em 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);
Essas respostas me ajudaram muito a fazer essa função:
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);
}
}
Contanto que você passe um objeto jquery dom / xml: para mim foi:
Jquery(this).find('content').eq(0)[0]
onde o conteúdo era o campo em que eu estava armazenando meu xml.
Há algum tempo, escrevi esta ferramenta https://bitbucket.org/surenrao/xml2json para o meu aplicativo de lista de observação de TV. Espero que isso ajude também.
Sinopse: Uma biblioteca para não apenas converter xml para json, mas também é fácil depurar (sem erros circulares) e recriar json de volta para xml. Características: - Analisar xml para objeto json. Imprima o objeto json de volta para xml. Pode ser usado para salvar xml no IndexedDB como objetos X2J. Imprimir objeto json.
Eu pessoalmente recomendaria esta ferramenta . É um conversor XML para JSON.
É muito leve e está em JavaScript puro. Não precisa de dependências. Você pode simplesmente adicionar as funções ao seu código e usá-lo como desejar.
Também leva em consideração os atributos 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”}}’
Aqui está uma demonstração online !
Disclaimer: Eu escrevi fast-xml-parser
O Fast XML Parser pode ajudar a converter XML em JSON e vice-versa. Aqui está o exemplo;
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);
}
Se você deseja analisar o objeto JSON ou JS no 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);
Aqui está uma boa ferramenta de uma biblioteca npm documentada e muito famosa que faz as conversões xml <-> js muito bem: diferentemente de algumas (talvez todas) das soluções propostas acima, ele também converte comentários xml.
var obj = {name: "Super", Surname: "Man", age: 23};
var builder = new xml2js.Builder();
var xml = builder.buildObject(obj);
Em 6 linhas simples do 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
}
Teste com echo "xml2json_example()" | node -r xml2json.es6
a fonte em https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6
Eu estava usando xmlToJson apenas para obter um único valor do xml.
Achei que fazer o seguinte é muito mais fácil (se o xml ocorrer apenas uma vez ..)
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
Criei uma função recursiva baseada em regex, caso você não queira instalar a biblioteca e entender a lógica por trás do que está acontecendo:
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;
}
Explicação de Regex para cada loop:
<tag />
Você pode verificar como o regex funciona aqui: https://regex101.com/r/ZJpCAL/1
Nota: Caso json possua uma chave com um valor indefinido, ela será removida. Por isso inseri nulo no final da linha 9.
A melhor maneira de fazer isso usando o lado do servidor como lado do cliente não funciona bem em todos os cenários. Eu estava tentando criar on-line json para xml e xml para json conversor usando javascript e me senti quase impossível, pois não estava funcionando em todos os cenários. Por fim, acabei fazendo isso no lado do servidor usando o Newtonsoft no ASP.MVC. Aqui está o conversor online http://techfunda.com/Tools/XmlToJson