XML e XPath

Boa formação, validação, namespaces, árvores, caminhos XPath, predicados e funções.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

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; #PCDATA aceita texto sem exigir número.
  • Bem formado não é seguro: desliga entidades externas em XML não confiável. &amp;, &lt;, 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ãoDá
/catalogo/livroOs três livro
/catalogo/livro[preco < 20]/titulo/text()Textos Redes, SQL
/catalogo/livro[preco < 20]/@idr1, 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]: primeiro livro de cada grupo de irmãos. (//livro)[1]: só o primeiro global.
  • categoria = 'web' e categoria != '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, query para nós, evaluate para escalares. Navegador: document.evaluate com 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”.

Explicação completa.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.