XML e XPath
Boa formação, validação, namespaces, árvores, caminhos XPath, predicados e funções.
Bem formado contra válido
- Bem formado: raiz única, aninhamento correto, maiúsculas exatas, atributos entre aspas.
<livro id=r1>e<Titulo>...</titulo>falham. - Válido: além disso, cumpre um contrato (DTD, XSD).
(titulo, preco)exige ordem;#PCDATAaceita texto sem exigir número. - Bem formado não é seguro: desliga entidades externas em XML não confiável.
&,<, CDATA sem]]>dentro, comentários sem--.
Documento
└── catalogo
└── livro [atributo id="r1"]
├── titulo
│ └── texto "Redes"
└── preco
└── texto "18"
- Nó documento não é o elemento raiz. Atributo não é filho (
@id); texto não é elemento (titulo/text()).
Caminhos (XPath 1.0)
/ inicial fixa a raiz; entre passos percorre filhos; // desce a qualquer profundidade; . contexto; .. pai; @ atributos; * qualquer nome.
Catálogo com Redes (18, r1), Algoritmos (25, a1), SQL (12, s1):
| Expressão | Dá |
|---|---|
/catalogo/livro | Os três livro |
/catalogo/livro[preco < 20]/titulo/text() | Textos Redes, SQL |
/catalogo/livro[preco < 20]/@id | r1, s1 |
count(/catalogo/livro) | 3 |
sum(/catalogo/livro/preco) | 55 |
Sem text(), recebes elementos. Filtra no passo certo: o preço é filho do livro.
Predicados: ordem e alcance
- Posições começam em 1.
[preco < 20][1]filtra e escolhe o primeiro restante;[1][preco < 20]escolhe o primeiro e testa depois (vazio se custar 30). //livro[1]: primeirolivrode cada grupo de irmãos.(//livro)[1]: só o primeiro global.categoria = 'web'ecategoria != 'web'podem ser ambas verdadeiras (basta um nó de cada lado). “Nenhuma é web”:not(categoria = 'web').- Eixos:
child,descendant,ancestor,following-sibling. Texto:contains,starts-with,normalize-space.last(),and/or/not,|para unir.
Namespaces e execução
- Nome = URI + local; prefixo é abreviatura descartável.
xmlns="urn:biblioteca"marca elementos sem prefixo, não atributos. - XPath 1.0 sem prefixo só vê namespace vazio: regista um prefixo para o URI (pode diferir do documento).
$xpath->registerNamespace('b', 'urn:biblioteca');
$livros = $xpath->query('/b:catalogo/b:livro');
- PHP:
loadXML,querypara nós,evaluatepara escalares. Navegador:document.evaluatecom contexto e tipo;iterateNext()aténull. - XPath seleciona; XSLT transforma; XQuery consulta e constrói; XSL-FO formata. Validação também existe em JSON: não é “XML com regras, JSON sem”.