Skip to content

XML e NF-e

A stdlib XML fornece parse e navegação de documentos XML diretamente em código Jade DSL. Inclui suporte nativo a NF-e (Nota Fiscal Eletrônica) brasileira.

Parse básico

jd
doc = XML.parse(xmlTexto)

Retorna um nó raiz navegável com as propriedades:

PropriedadeTipoDescrição
tagtextoNome da tag XML
atributosmapa<texto>Atributos da tag
filhoslista<XMLNode>Elementos filhos
textotextoConteúdo de texto do nó
xml
<produto>
  <nome>Notebook</nome>
  <preco>3500.00</preco>
</produto>
jd
doc = XML.parse(xmlTexto)
Console.escrever(doc.tag)              // "produto"
Console.escrever(doc.filhos.tamanho()) // 2

XML.buscar

Busca o primeiro elemento com a tag informada (busca em profundidade).

jd
no = XML.buscar(doc, "nome")
Console.escrever(no.texto)  // "Notebook"

XML.buscarTodos

Busca todos os elementos com a tag informada.

jd
itens = XML.buscarTodos(doc, "item")
para item em itens
  Console.escrever(XML.texto(item, "descricao"))
fim

XML.texto

Atalho para buscar o texto de um elemento filho pelo nome da tag.

jd
nome = XML.texto(doc, "nome")
// equivale a: XML.buscar(doc, "nome").texto

Serialização

jd
xmlString = XML.serializar(no)

Converte um nó de volta para string XML.

NF-e — Nota Fiscal Eletrônica

XML.parsarNFe

Parser especializado que extrai os campos principais de uma NF-e.

jd
nota = XML.parsarNFe(xmlNFe)

Retorna um objeto com:

CampoTipoDescrição
chavetextoChave de acesso (44 dígitos)
numerotextoNúmero da nota
serietextoSérie
dataEmissaotextoData/hora de emissão
cnpjEmitentetextoCNPJ do emitente
nomeEmitentetextoRazão social do emitente
cnpjDestinatariotextoCNPJ do destinatário
nomeDestinatariotextoRazão social do destinatário
valorTotaldecimalValor total da nota
itenslistaItens da nota (ver abaixo)

Cada item em itens:

CampoTipoDescrição
descricaotextoDescrição do produto (xProd)
quantidadedecimalQuantidade comercializada
valorUnitariodecimalValor unitário
valorTotaldecimalValor total do item

Exemplo completo

jd
servico FiscalService
  funcao importarNFe(xmlNFe: texto)
    nota = XML.parsarNFe(xmlNFe)

    Console.escrever("=== NF-e Recebida ===")
    Console.escrever("Número:    " + nota.numero + "/" + nota.serie)
    Console.escrever("Emitente:  " + nota.nomeEmitente + " (" + nota.cnpjEmitente + ")")
    Console.escrever("Destinat.: " + nota.nomeDestinatario)
    Console.escrever("Emissão:   " + nota.dataEmissao)
    Console.escrever("Total:     R$ " + nota.valorTotal)
    Console.escrever("")
    Console.escrever("Itens:")

    para item em nota.itens
      Console.escrever(
        "  " + item.descricao +
        " | Qtd: " + item.quantidade +
        " | Unit: R$ " + item.valorUnitario +
        " | Total: R$ " + item.valorTotal
      )
    fim
  fim
fim

Validação com CNPJ

Combine XML.parsarNFe com a validação de CNPJ da stdlib de texto:

jd
nota = XML.parsarNFe(xmlNFe)

se nao Texto.validarCNPJ(nota.cnpjEmitente)
  erro "NF-e com CNPJ emitente inválido: " + nota.cnpjEmitente
fim

Parse manual (XML genérico)

xml
<pedido id="1001">
  <cliente>João Silva</cliente>
  <itens>
    <item><produto>Notebook</produto><qtd>2</qtd></item>
    <item><produto>Mouse</produto><qtd>5</qtd></item>
  </itens>
</pedido>
jd
doc = XML.parse(xmlPedido)

// Acessar atributo
idPedido = XML.atributo(doc, "id")  // "1001"

// Buscar texto
cliente = XML.texto(doc, "cliente")  // "João Silva"

// Buscar todos os itens
itens = XML.buscarTodos(doc, "item")
para item em itens
  produto = XML.texto(item, "produto")
  qtd = XML.texto(item, "qtd")
  Console.escrever(produto + " x" + qtd)
fim

Compatibilidade

XML.parse usa DOMParser no browser e um parser manual em Node.js, sem dependências externas. Suporta XML padrão incluindo declarações <?xml ...?> (ignoradas), atributos com aspas simples ou duplas, e tags auto-fechadas <tag/>.

Limitações

O parser manual (Node.js) não suporta CDATA, namespaces complexos, ou entidades HTML (&amp;, &lt;). Para XMLs com essas construções em ambiente servidor, use uma biblioteca externa via HttpClient ou pré-processe o XML antes.

Próximo passo

Matemática e Estatística

Feito com ❤️ para desenvolvedores brasileiros.