Converta XML para JSON (e vice-versa) usando Javascript


145

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?


8
Explicar as inconsistências, por favor
Josh Stodola

4
Especificamente, tinha a ver com a conversão de matrizes JSON com apenas 1 elemento em XML. Quando você o converteu novamente em JSON, em vez de uma matriz de 1 elemento, ele criou o objeto literal. Eu trabalhei em torno disso, verificando o tipo com $ .isArray () e agrupando-o em uma matriz se! $. IsArray ().
Jason Suárez

1
xml2json - fyneworks.com/jquery/xml-to-json - quebra lances 500 a partir de 15/02/2013 14:25 AEST
ysrb

O link json2xml está quebrado.
whirlwin

@ysrb O exemplo do plugin não funcionará no IE8!
cara

Respostas:


103

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.


Obrigado pela resposta! No meu caso, o JSON é a representação canônica e o XML é usado apenas para XSLT .. cuja utilização não é minha ideia! :)
Jason Suárez

Isso é apenas no navegador. Não se aplica a node.js ou ambientes que não são de navegador. Alguma outra ideia?
Homer6

1
Em relação ao comentário @JasonDenizac ao seu post, eu não tenho certeza de entender como este link ajuda a corrigir o problema de ter um objeto em vez de uma matriz de um item ...
guiomie

1
Descobri que se você iniciar do json-xml-json, esta biblioteca funcionará bem, mas se você quiser xml-json-xml, há um problema com a reversibilidade, pois ele adiciona elementos xml de metadados como <o> e <e>
vishr

3
Observe que esta é uma solução licenciada com copyleft. É apenas uma opção quando você está escrevendo um software de código aberto.
Jasper

48

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

1
Olá, como você superou o problema em que, se você tem um objeto em um objeto, ele está em um objeto literário, onde se houver n> 1 objetos, você tem uma matriz. Isso torna difícil para o uso de XML para objetos JSON em modelos ...
guiomie

Sim, você deve usar algum truque e isso depende do seu conhecimento sobre a estrutura XML (porque não há XSD aqui). Use <node> ... <node> _asArray sintaxe para acessar o nó sempre como array (sequência)
abdolence

1
Amostra: // string XML para JSON var xmlText = "<MyOperation> <test> Sucesso </test> <test2> <item> ddsfg </item> <item> dsdgfdgfd </item> </test2> </MyOperation> "; var jsonObj = X2JS.xml_str2json (xmlText); alerta (jsonObj.MyOperation.test); alerta (jsonObj.MyOperation.test_asArray [0]);
abdolence

Meu principal problema, é quando eu transformo meu json em xml de volta, o json está cheio de propriedades extras e quando a versão xml de string mantém todas as coisas inúteis. Tem todo o tipo de vírgulas e espaços em branco ...
guiomie

você pode enviar sua amostra para code.google.com/p/x2js/issues Vou verificar
abdolence

25

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.


3

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.


@kleopatra este link aponta para a ferramenta que converte xml em json. Não é uma referência, mas o link real para o recurso. Não tenho certeza de que outra forma eu deveria fazê-lo :)
surya

2

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 !


4
repositório github não encontrado
brauliobo

1

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

: D FXP é mais que um conversor XML 2 JSON. Por favor, verifique o leia-me.
Amit Kumar Gupta

1

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

1

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.es6a fonte em https://github.com/brauliobo/biochemical-db/blob/master/lib/xml2json.es6


0

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


0

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:

  • res [0] - retorna o xml (como está)
  • res [1] - retorna o nome da tag xml
  • res [2] - retorna o conteúdo xml
  • res [3] - retorna o nome da tag xml, caso ela se feche. No exemplo:<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.


-2

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.