Análise XML de uma cadeia variável em JavaScript

Eu tenho uma seqüência variável que contém XML bem formado e válido. Eu preciso usar o código JavaScript para analisar esse feed.

Como posso conseguir isso usando código JavaScript (compatível com navegador)?

Atualização: Para uma resposta mais correta, veja a resposta de Tim Down .

O Internet Explorer e, por exemplo, os navegadores baseados no Mozilla expõem diferentes objects para análise XML, portanto, é aconselhável usar uma estrutura JavaScript como o jQuery para lidar com as diferenças entre navegadores.

Um exemplo realmente básico é:

var xml = "Beethoven"; var result = $(xml).find("album").text(); 

Nota: Como apontado nos comentários; O jQuery não faz qualquer análise XML, depende do método DOM innerHTML e irá analisá-lo como se fosse um HTML, então tenha cuidado ao usar nomes de elementos HTML no seu XML. Mas eu acho que funciona bastante bem para uma análise XML simples, mas provavelmente não é sugerido para análise de XML intensiva ou ‘dinâmica’, onde você não mostra antecipadamente o que o XML virá e isso testa se tudo for analisado como esperado.

Resposta atualizada para 2017

A seguir, será analisada uma cadeia XML em um documento XML em todos os principais navegadores. A menos que você precise de suporte para o IE <= 8 ou algum navegador obscuro, você pode usar a seguinte função:

 function parseXml(xmlStr) { return new window.DOMParser().parseFromString(xmlStr, "text/xml"); } 

Se você precisar dar suporte ao IE <= 8, o seguinte fará o trabalho:

 var parseXml; if (typeof window.DOMParser != "undefined") { parseXml = function(xmlStr) { return new window.DOMParser().parseFromString(xmlStr, "text/xml"); }; } else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) { parseXml = function(xmlStr) { var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = "false"; xmlDoc.loadXML(xmlStr); return xmlDoc; }; } else { throw new Error("No XML parser found"); } 

Uma vez que você tenha um Document obtido via parseXml , você pode usar os methods / propriedades usuais de travessia do DOM como childNodes e getElementsByTagName() para obter os nós que você quer.

Exemplo de uso:

 var xml = parseXml("Stuff"); alert(xml.documentElement.nodeName); 

Se você estiver usando o jQuery, a partir da versão 1.5, você pode usar o método parseXML() integrado, que é funcionalmente idêntico à function acima.

 var xml = $.parseXML("Stuff"); alert(xml.documentElement.nodeName); 

A maioria dos exemplos na Web (e alguns apresentados acima) mostram como carregar um XML de um arquivo de uma maneira compatível com o navegador. Isso é fácil, exceto no caso do Google Chrome, que não suporta o método document.implementation.createDocument() . Ao usar o Chrome, para carregar um arquivo XML em um object XmlDocument, você precisa usar o object XmlHttp embutido e, em seguida, carregar o arquivo passando seu URI.

No seu caso, o cenário é diferente, porque você deseja carregar o XML de uma variável de seqüência de caracteres , não uma URL. Para este requisito, no entanto, o Chrome supostamente funciona como o Mozilla (ou pelo menos foi o que ouvi) e suporta o método parseFromString ().

Aqui está uma function que uso (faz parte da biblioteca de compatibilidade do navegador que estou construindo atualmente):

 function LoadXMLString(xmlString) { // ObjectExists checks if the passed parameter is not null. // isString (as the name suggests) checks if the type is a valid string. if (ObjectExists(xmlString) && isString(xmlString)) { var xDoc; // The GetBrowserType function returns a 2-letter code representing // ...the type of browser. var bType = GetBrowserType(); switch(bType) { case "ie": // This actually calls into a function that returns a DOMDocument // on the basis of the MSXML version installed. // Simplified here for illustration. xDoc = new ActiveXObject("MSXML2.DOMDocument") xDoc.async = false; xDoc.loadXML(xmlString); break; default: var dp = new DOMParser(); xDoc = dp.parseFromString(xmlString, "text/xml"); break; } return xDoc; } else return null; } 

O Marknote é um bom analisador XML JavaScript cross-browser leve. É orientada a objects e tem muitos exemplos, além de a API estar documentada. É relativamente novo, mas funcionou bem em um dos meus projetos até agora. Uma coisa que eu gosto é que ele vai ler XML diretamente de strings ou URLs e você também pode usá-lo para converter o XML em JSON.

Veja um exemplo do que você pode fazer com o Marknote:

 var str = '' + ' ' + ' ' + ''; var parser = new marknote.Parser(); var doc = parser.parse(str); var bookEls = doc.getRootElement().getChildElements(); for (var i=0; i 

Eu sempre usei a abordagem abaixo, que funciona no IE e no Firefox.

Exemplo XML:

     

JavaScript:

 function getFruits(xml) { var fruits = xml.getElementsByTagName("fruits")[0]; if (fruits) { var fruitsNodes = fruits.childNodes; if (fruitsNodes) { for (var i = 0; i < fruitsNodes.length; i++) { var name = fruitsNodes[i].getAttribute("name"); var colour = fruitsNodes[i].getAttribute("colour"); alert("Fruit " + name + " is coloured " + colour); } } } } 

Aparentemente, o jQuery agora fornece jQuery.parseXML http://api.jquery.com/jQuery.parseXML/ a partir da versão 1.5

jQuery.parseXML( data ) Retorna: XMLDocument

Por favor, dê uma olhada no XML DOM Parser ( W3Schools ). É um tutorial sobre análise de DOM XML. O analisador DOM difere do navegador para o navegador, mas a API do DOM é padronizada e permanece a mesma (mais ou menos).

Como alternativa, use o E4X se você puder se restringir ao Firefox. É relativamente mais fácil de usar e faz parte do JavaScript desde a versão 1.6. Aqui está um pequeno uso de amostra …

 //Using E4X var xmlDoc=new XML(); xmlDoc.load("note.xml"); document.write(xmlDoc.body); //Note: 'body' is actually a tag in note.xml, //but it can be accessed as if it were a regular property of xmlDoc. 
    

Para mais informações, consulte este http://www.easycodingclub.com/xml-parser-in-javascript/javascript-tutorials/

Disclaimer : Eu criei o xml-parser rápido

Eu criei o fast-xml-parser para analisar uma string XML em object JS / JSON ou object de passagem intermediária. Espera-se que seja compatível em todos os navegadores (porém testado apenas no Chrome, Firefox e IE).

Uso

 var options = { //default attrPrefix : "@_", attrNodeName: false, textNodeName : "#text", ignoreNonTextNodeAttr : true, ignoreTextNodeAttr : true, ignoreNameSpace : true, ignoreRootElement : false, textNodeConversion : true, textAttrConversion : false, arrayMode : false }; if(parser.validate(xmlData)){//optional var jsonObj = parser.parse(xmlData, options); } //Intermediate obj var tObj = parser.getTraversalObj(xmlData,options); : var jsonObj = parser.convertToJson(tObj); 

Nota : Ele não usa o analisador DOM, mas analisa a sequência usando RE e a converte em object JS / JSON.

Experimente online , CDN

Você também pode usar a function jquery ($. ParseXML) para manipular a string xml

exemplo javascript:

 var xmlString = ''; var xmlDoc = $.parseXML(xmlString); $(xmlDoc).find('name').each(function(){ console.log('name:'+$(this).attr('name')) })