Análise XML de jQuery com namespaces

Sou novo no jQuery e gostaria de analisar um documento xml.

Eu sou capaz de analisar XML regular com os namespaces padrão, mas com xml, como:

                       

Tudo o que eu realmente quero são os .

Até agora eu tenho feito:

 $.get(xmlPath, {}, function(xml) { $("rs:data", xml).find("z:row").each(function(i) { alert("found zrow"); }); }, "xml"); 

Com realmente sem sorte. Alguma ideia? Obrigado.

Entendi.

Acontece que isso requer \\ para escaping do cólon.

 $.get(xmlPath, {}, function(xml) { $("rs\\:data", xml).find("z\\:row").each(function(i) { alert("found zrow"); }); }, "xml"); 

Como Rich apontou:

A melhor solução não requer escape e funciona em todos os navegadores “modernos”:

 .find("[nodeName=z:row]") 

Passei várias horas lendo sobre plugins e todos os tipos de soluções sem sorte.

ArnisAndy postou um link para uma discussão jQuery, onde esta resposta é oferecida e posso confirmar que isso funciona para mim no Chrome (v18.0), FireFox (v11.0), IE (v9.08) e Safari (v5.1.5 ) usando jQuery (v1.7.2).

Eu estou tentando raspar um feed do WordPress onde o conteúdo é chamado e isso é o que funcionou para mim:

 content: $this.find("content\\:encoded, encoded").text() 

Se você estiver usando o jquery 1.5, terá que adicionar cotações em torno do valor do atributo do seletor de nó para fazê-lo funcionar:

 .find('[nodeName="z:row"]') 

Embora a resposta acima pareça estar correta, ela não funciona nos navegadores webkit (Safari, Chrome). Uma solução melhor que eu acredito seria:

 .find("[nodeName=z:myRow, myRow]") 

Caso alguém precise fazer isso sem o jQuery , apenas com o Javascript normal, e para o Google Chrome (webkit) , essa é a única maneira que encontrei para fazê-lo funcionar depois de muita pesquisa e testes.

parentNode.getElementsByTagNameNS("*", "name");

Isso funcionará para recuperar o seguinte nó:

. Como você pode ver, o prefixo ou espaço de nomes é omitido e corresponderá a elementos com espaços de nomes diferentes, desde que o nome da tag seja name . Mas espero que isso não seja um problema para você.

Nada disso funcionou para mim (estou desenvolvendo uma extensão do Google Chrome):

getElementsByTagNameNS("prefix", "name")

getElementsByTagName("prefix:name")

getElementsByTagName("prefix\\:name")

getElementsByTagName("name")

Editar : depois de algum tempo de sono, eu encontrei uma solução alternativa de trabalho 🙂 Esta function retorna o primeiro nó correspondente a um nodeName completo, como :

 // Helper function for nodes names that include a prefix and a colon, such as "" function getElementByNodeName(parentNode, nodeName) { var colonIndex = nodeName.indexOf(":"); var tag = nodeName.substr(colonIndex + 1); var nodes = parentNode.getElementsByTagNameNS("*", tag); for (var i = 0; i < nodes.length; i++) { if (nodes[i].nodeName == nodeName) return nodes[i] } return undefined; } 

Ele pode ser facilmente modificado no caso de você precisar devolver todos os elementos correspondentes. Espero que ajude!

Nenhuma das soluções acima funciona tão bem. Eu encontrei isso e foi melhorado para a velocidade. Basta adicionar isso, funcionou como um encanto:

 $.fn.filterNode = function(name) { return this.find('*').filter(function() { return this.nodeName === name; }); }; 

uso:

 var ineedthatelementwiththepsuedo = $('someparentelement').filterNode('dc:creator'); 

fonte: http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/

O “\” escape não é infalível e o simples

 .find('[nodeName="z:row"]') 

O método parece ter sido quebrado a partir do Jquery 1.7. Consegui encontrar uma solução para o 1.7, usando uma function de filtro, aqui: Melhorando o Nó XML JavaScript Encontrando Desempenho

Vale a pena notar que, a partir do jQuery 1.7, houve problemas com algumas soluções para encontrar elementos com nome compartilhado. Veja estes links para mais informações:

  • jQuery Bug Ticket, notando a falta de suporte cross-browser para a habilidade de fazer .find (‘[nodeName = “z: row”]’)
  • Uma solução sugerida de plug-in com alguns testes de desempenho.

Solução encontrada no comentário: Analisando XML com namespaces usando jQuery $ (). Find

Usando a segunda metade do nome do nó depois que o cólon funcionou para mim. Usado .find (“lat”) em vez de .find (“geo \: lat”) e funcionou para mim.


Minha configuração:

  • Chrome 42
  • jQuery 2.1.3

Exemplo de XML (snippet da Google Contacts API):

  http://www.google.com/m8/feeds/contacts/mstefanow%40gmail.com/base/0   

Código de análise:

 var xmlDoc = $.parseXML( xml ); var $xml = $( xmlDoc ); var $emailNode = $xml.find( "email" ); $("#email").html($emailNode.attr("address")); 

Plnkr: http://plnkr.co/edit/l8VzyDq1NHtn5qC9zTjf?p=preview

O jQuery 1.7 não funciona com o seguinte:

 $(xml).find("[nodeName=a:IndexField2]") 

Uma solução que consegui trabalhar no Chrome, Firefox e IE é usar seletores que funcionam nos seletores IE e que funcionam no Chrome, com base no fato de que uma delas funciona no IE e outra no Chrome:

 $(xml).find('a\\\\:IndexField2, IndexField2') 

No IE, isso retorna nós usando o namespace (o Firefox e o IE exigem o namespace) e, no Chrome, o seletor retorna nós com base no seletor de não-namespace. Eu não testei isso no Safari, mas deve funcionar porque está funcionando no Chrome.

Minha solução (porque eu uso um proxy Php) é replace: namespace por _ … então não há mais problemas de namespace 😉

Mantenha simples !

Resposta Original: jQuery XML analisando como obter o atributo do elemento

Veja um exemplo de como obter com sucesso o valor no Chrome.

  item.description = jQuery(this).find("[nodeName=itunes\\:summary]").eq(0).text(); 

A partir do início de 2016, para mim, a seguinte syntax funciona com o jQuery 1.12.0:

  • IE 11 (11.0.9600.18204, atualização 11.0.28, KB3134815): .find("z\\:row")
  • Firefox 44.0.2: .find("z\\:row")
  • Chrome 44.0.2403.89m: .find("row")

A syntax .find("[nodeName=z:row]") não funciona em nenhum dos navegadores mencionados acima. Não encontrei uma maneira de aplicar um namespace no Chrome.

Juntando tudo, a seguinte syntax funciona em todos os navegadores mencionados acima: .find("row,z\\:row")

Como mencionado acima, há problemas com a solução acima com navegadores / versões atuais do jQuery – o plug-in sugerido não funciona completamente devido a problemas de caso ( nodeName , como uma propriedade, às vezes está em maiúsculas). Então, escrevi a seguinte function rápida:

 $.findNS = function (o, nodeName) { return o.children().filter(function () { if (this.nodeName) return this.nodeName.toUpperCase() == nodeName.toUpperCase(); else return false; }); }; 

Exemplo de uso:

 $.findNS($(xml), 'x:row'); 

conteúdo: $this.find("content\\:encoded, encoded").text()

é a solução perfeita …

Existe um plugin jquery-xmlns para o jQuery trabalhar com namespaces em seletores.

Eu não vi nenhuma documentação sobre o uso do JQuery para analisar XML. O JQuery geralmente usa o Browser dom para navegar em um documento HTML, não acredito que ele leia o próprio html.

Você provavelmente deve olhar para o manuseio XML embutido no próprio JavaScript.

http://www.webreference.com/programming/javascript/definitive2/

apenas substituiu o namespace por string vazia. Funciona bem para mim. Solução testada nos navegadores: Firefox, IE, Chrome

Minha tarefa era ler e analisar um arquivo EXCEL por meio da API REST do Sharepoint EXCEL. A resposta XML contém tags com namespace “x:”.

Decidi replace o namespace no XML por uma string vazia. Funciona desta maneira: 1. Retire o nó de interesse da resposta XML 2. Converta o nó selecionado XML-Response (Document) para String 2. Substitua o namespace pela string vazia 3. Converta string de volta para o XML-Document

Veja o esboço do código aqui ->

 function processXMLResponse)(xData) { var xml = TOOLS.convertXMLToString("", "",$(xData).find("entry content")[0]); xml = xml.replace(/x:/g, ""); // replace all occurences of namespace xData = TOOLS.createXMLDocument(xml); // convert string back to XML } 

Para conversão de XML para string, encontre uma solução aqui: http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string

Como alternativa, você pode usar o analisador xml rápido em seu projeto e converter os dados XML em object JS / JSON. Então você pode usá-lo como propriedade de object. Não usa o JQuery ou outras bibliotecas, mas resolve o seu propósito.

 var xmlData = '' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +' ' +'' var jsObj = parser.parse(xmlData,{attrPrefix:"",ignoreTextNodeAttr: false}); document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][0],null,4) + "
"); document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][1],null,4) + "
"); document.write(JSON.stringify(jsObj.xml["rs:data"]["z:row"][2],null,4) + "
");
  

Para navegadores Webkit, você pode deixar o sinal de dois pontos. Então, para encontrar em um feed RSS, por exemplo, você pode fazer isso:

 $(this).find("content");