Percorrer a árvore de nós do XML DOM

Percorrer (Traverse) significa percorrer a árvore de nós.

Percorrer a árvore de nós

Você frequentemente precisará iterar documentos XML, por exemplo: quando você deseja extrair os valores de cada elemento.

Este processo é chamado de “percorrer a árvore de nós”

Este exemplo ilustra a iteração sobre todos os nós filhos de <book> e exibe seus nomes e valores:

Exemplo

<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
var x, i ,xmlDoc;
var txt = "";
var text = "<book>" +
"<title>雅舍谈吃</title>" +
"<author>梁实秋</author>" +
"<year>2013</year>" +
"</book>";
parser = new DOMParser();
xmlDoc = parser.parseFromString(text,"text/xml");
// documentElement sempre representa o nó raiz
x = xmlDoc.documentElement.childNodes;
for (i = 0; i < x.length ;i++) {
    txt += x[i].nodeName + ": " + x[i].childNodes[0].nodeValue + "<br>";
}
document.getElementById("demo").innerHTML = txt;
</script>
</body>
</html>

Experimente pessoalmente

Explicação do exemplo:

  1. Carregar a string XML para xmlDoc em
  2. Obter os nós filhos do elemento raiz
  3. Saída do nome de cada nó filho, bem como o valor do nó de texto

Diferenças entre navegadores no processamento DOM

Todos os navegadores modernos suportam o padrão W3C DOM.

Mas, há algumas diferenças entre os navegadores.

A maneira como eles tratam espaços em branco e quebras de linha

DOM - espaços em branco e quebras de linha

O XML geralmente contém quebras de linha ou caracteres em branco entre nós. Isso ocorre quando o documento é editado com editores simples, como o Bloco de Notas.

O exemplo a seguir (editado no Bloco de Notas) contém CR/LF (caracteres de nova linha) entre cada linha e dois espaços antes de cada nó filho:

<book>
  <title>雅舍谈吃</title>
  <author>梁实秋</author>
  <press>江苏文艺出版社</press>
  <year>2013</year>
  <price>35</price>
  <ISBN>9787539962771</ISBN>
</book>

O Internet Explorer 9 e versões anteriores não consideram espaços em branco ou novas linhas como nós de texto, enquanto outros navegadores fazem isso.

O exemplo a seguir mostrará o número de nós filhos do elemento raiz (books.xml). As versões do IE9 e anteriores retornarão 6 nós filhos, enquanto as versões do IE10 e posteriores e outros navegadores retornarão 9 nós filhos:

Exemplo

function myFunction(xml) {
var xmlDoc = xml.responseXML;
    x = xmlDoc.documentElement.childNodes;
    document.getElementById("demo").innerHTML =
    "Número de sub-nó: " + x.length;
}

Experimente pessoalmente

PCDATA - Dados de caractere analisados (Parsed Character Data)

Normalmente, os analisadores XML analisam todo o texto do documento XML.

Quando analisando elementos XML, também é analisado o texto entre os marcadores XML:

<message>Este texto também será analisado</message>

O analisador executa essa operação porque elementos XML podem conter outros elementos, como neste exemplo, onde o elemento <name> contém outros dois elementos (first e last):

<name><first>Bill</first><last>Gates</last></name>

O analisador o dividirá em seguintes sub-elementos:

<name>
  <first>Bill</first>
  <last>Gates</last>
</name>

“Dados de caractere analisados” (PCDATA) é um termo usado para descrever dados de texto que serão analisados pelo analisador XML.

CDATA - Dados de caractere não analisados (Unparsed Character Data)

O termo CDATA é usado para descrever dados de texto que não devem ser analisados pelo analisador XML.

"<" e "&" e outros caracteres são ilegais dentro de elementos XML.

"<" causará erro, pois o analisador o interpreta como o início de um novo elemento.

"&" causará erro, pois o analisador o interpreta como o início de um entidade de caractere.

Alguns textos (por exemplo, código JavaScript) contêm uma grande quantidade de "<" ou "&" Caracter. Para evitar erros, o código do script pode ser definido como CDATA.

Todo o conteúdo dentro da parte de CDATA será ignorado pelo analisador.

" Parte de CDATA com "<![CDATA[" Início, com "]]>" Fim: "

<script>
<![CDATA[
function matchwo(a,b) {
    if (a < b && a < 0) {
        return 1;
    else {
        return 0;
    }
}
]]>
</script>

No exemplo acima, o analisador ignorará todo o conteúdo dentro da seção CDATA.

Observações sobre a seção CDATA:

A seção CDATA não pode conter a string "]]>". Não é permitido o encadeamento de partes CDATA.

" Marca o final da seção CDATA]]>" Não pode conter espaços ou quebras de linha.