kb.erickguedes.com
XML: Estrutura e Processamento

Namespaces e XPath

Aula 3 de 5

Namespaces em XML

Namespaces evitam conflitos entre elementos de diferentes vocabulários XML.

Declaração de Namespaces

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns="http://www.w3.org/1999/xhtml"
  version="1.0">

  <xsl:template match="/">
    <html>
      <body>
        <fo:block font-weight="bold">
          <xsl:value-of select="//titulo"/>
        </fo:block>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Namespace Default e Prefixos

<!-- Namespace default (sem prefixo) -->
<html xmlns="http://www.w3.org/1999/xhtml">
  <head><title>Página</title></head>
  <body>
    <!-- Com prefixo explícito -->
    <svg:svg xmlns:svg="http://www.w3.org/2000/svg"
             width="100" height="100">
      <svg:circle cx="50" cy="50" r="40"/>
    </svg:svg>
  </body>
</html>

XPath — Navegação em Documentos XML

XPath é uma linguagem para navegar em elementos e atributos de documentos XML.

Eixos Principais

child::livro          # filhos diretos
descendant::autor     # todos os descendentes
parent::catalogo      # elemento pai
attribute::id         # atributo id
following::produto    # elementos seguintes
preceding::produto    # elementos anteriores

Predicados e Funções

//livro[ano > 2020]                              # condicional
//produto[@categoria = 'Eletrônicos']            # por atributo
//*[contains(nome, 'Pro')]                       # função string
//item[position() <= 3]                          # posição
//preco[number(text()) > 100]                    # função number
string-length(//titulo)                          # comprimento da string
concat(//nome, ' - ', //categoria)               # concatenação

XPath na Prática

# Extrair valores com xmllint e XPath
xmllint --xpath "//produto[@id='101']/nome/text()" catalogo.xml

# Contar elementos
xmllint --xpath "count(//produto)" catalogo.xml

# Usar xpath em pipeline
curl -s http://api.exemplo.com/dados.xml | \
  xmllint --xpath "//item[preco > 50]/nome/text()" -

Lab: Navegando com Namespaces e XPath

# 1. Criar documento com namespaces
cat << 'EOF' > ns-doc.xml
<?xml version="1.0"?>
<ns:loja xmlns:ns="http://exemplo.com/loja"
         xmlns:cat="http://exemplo.com/catalogo">
  <ns:cliente id="1">
    <ns:nome>Ana Costa</ns:nome>
  </ns:cliente>
  <cat:produto id="P001">
    <cat:nome>Notebook</cat:nome>
    <cat:preco>4500.00</cat:preco>
  </cat:produto>
</ns:loja>
EOF

# 2. XPath com namespace (xmllint precisa declarar namespace)
xmllint --shell ns-doc.xml << 'EOF'
setns ns=http://exemplo.com/loja
setns cat=http://exemplo.com/catalogo
xpath //ns:cliente/ns:nome/text()
xpath //cat:produto[cat:preco > 4000]/cat:nome/text()
xpath count(//cat:produto)
quit
EOF

# 3. Extrair todos os nomes com XPath
xmllint --xpath "//*[local-name()='nome']/text()" ns-doc.xml

Namespaces são essenciais para interoperabilidade; XPath é a lingua franca da navegação XML.