Árvore de nós de travessia XML DOM
Atravessar significa percorrer ou percorrer a árvore de nós.
Atravessando a árvore de nós
Muitas vezes você quer fazer um loop em um documento XML, por exemplo: quando você quer extrair o valor de cada elemento.
Isso é chamado de "Atravessando a árvore de nós"
O exemplo abaixo percorre 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>Everyday Italian</title>" +
"<author>Giada De Laurentiis</author>" +
"<year>2005</year>" +
"</book>";
parser = new DOMParser();
xmlDoc
= parser.parseFromString(text,"text/xml");
// documentElement always
represents the root node
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>
Saída:
title: Everyday Italian
author: Giada De Laurentiis
year: 2005
Exemplo explicado:
- Carregue a string XML em xmlDoc
- Obtenha os nós filhos do elemento raiz
- Para cada nó filho, imprima o nome do nó e o valor do nó do nó de texto
Diferenças do navegador na análise do DOM
Todos os navegadores modernos suportam a especificação W3C DOM.
No entanto, existem algumas diferenças entre os navegadores. Uma diferença importante é:
- A maneira como eles lidam com espaços em branco e novas linhas
DOM - Espaços em Branco e Novas Linhas
O XML geralmente contém uma nova linha ou caracteres de espaço em branco entre os nós. Este é frequentemente o caso quando o documento é editado por um editor simples como o Bloco de Notas.
O exemplo a seguir (editado pelo Bloco de Notas) contém CR/LF (nova linha) entre cada linha e dois espaços na frente de cada nó filho:
<book>
<title>Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
O Internet Explorer 9 e versões anteriores NÃO tratam espaços em branco vazios ou novas linhas como nós de texto, enquanto outros navegadores o fazem.
O exemplo a seguir produzirá o número de nós filho que o elemento raiz (de books.xml ) possui. O IE9 e versões anteriores produzirão 4 nós filhos, enquanto o IE10 e versões posteriores e outros navegadores produzirão 9 nós filhos:
Exemplo
function myFunction(xml) {
var xmlDoc = xml.responseXML;
x =
xmlDoc.documentElement.childNodes;
document.getElementById("demo").innerHTML =
"Number
of child nodes: " + x.length;
}
PCDATA - Dados de caracteres analisados
Os analisadores XML normalmente analisam todo o texto em um documento XML.
Quando um elemento XML é analisado, o texto entre as tags XML também é analisado:
<message>This text is also parsed</message>
O analisador faz isso porque os elementos XML podem conter outros elementos, como neste exemplo, onde o elemento <name> contém dois outros elementos (primeiro e último):
<name><first>Bill</first><last>Gates</last></name>
e o analisador o dividirá em subelementos como este:
<name>
<first>Bill</first>
<last>Gates</last>
</name>
Dados de Caracteres Analisados (PCDATA) é um termo usado sobre dados de texto que serão analisados pelo analisador XML.
CDATA - Dados de caracteres (não analisados)
O termo CDATA é usado para dados de texto que não devem ser analisados pelo analisador XML.
Caracteres como "<" e "&" são ilegais em elementos XML.
"<" gerará um erro porque o analisador o interpreta como o início de um novo elemento.
"&" gerará um erro porque o analisador o interpreta como o início de uma entidade de caractere.
Algum texto, como código JavaScript, contém muitos caracteres "<" ou "&". Para evitar erros, o código de script pode ser definido como CDATA.
Tudo dentro de uma seção CDATA é ignorado pelo analisador.
Uma seção CDATA começa com " <![CDATA[ " e termina com " ]]> ":
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)
{
return 1;
} else
{
return 0;
}
}
]]>
</script>
No exemplo acima, tudo dentro da seção CDATA é ignorado pelo analisador.
Notas sobre as seções CDATA:
Uma seção CDATA não pode conter a string "]]>". Seções CDATA aninhadas não são permitidas.
O "]]>" que marca o final da seção CDATA não pode conter espaços ou quebras de linha.