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
doc = XML.parse(xmlTexto)Retorna um nó raiz navegável com as propriedades:
| Propriedade | Tipo | Descrição |
|---|---|---|
tag | texto | Nome da tag XML |
atributos | mapa<texto> | Atributos da tag |
filhos | lista<XMLNode> | Elementos filhos |
texto | texto | Conteúdo de texto do nó |
<produto>
<nome>Notebook</nome>
<preco>3500.00</preco>
</produto>doc = XML.parse(xmlTexto)
Console.escrever(doc.tag) // "produto"
Console.escrever(doc.filhos.tamanho()) // 2Navegação
XML.buscar
Busca o primeiro elemento com a tag informada (busca em profundidade).
no = XML.buscar(doc, "nome")
Console.escrever(no.texto) // "Notebook"XML.buscarTodos
Busca todos os elementos com a tag informada.
itens = XML.buscarTodos(doc, "item")
para item em itens
Console.escrever(XML.texto(item, "descricao"))
fimXML.texto
Atalho para buscar o texto de um elemento filho pelo nome da tag.
nome = XML.texto(doc, "nome")
// equivale a: XML.buscar(doc, "nome").textoSerialização
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.
nota = XML.parsarNFe(xmlNFe)Retorna um objeto com:
| Campo | Tipo | Descrição |
|---|---|---|
chave | texto | Chave de acesso (44 dígitos) |
numero | texto | Número da nota |
serie | texto | Série |
dataEmissao | texto | Data/hora de emissão |
cnpjEmitente | texto | CNPJ do emitente |
nomeEmitente | texto | Razão social do emitente |
cnpjDestinatario | texto | CNPJ do destinatário |
nomeDestinatario | texto | Razão social do destinatário |
valorTotal | decimal | Valor total da nota |
itens | lista | Itens da nota (ver abaixo) |
Cada item em itens:
| Campo | Tipo | Descrição |
|---|---|---|
descricao | texto | Descrição do produto (xProd) |
quantidade | decimal | Quantidade comercializada |
valorUnitario | decimal | Valor unitário |
valorTotal | decimal | Valor total do item |
Exemplo completo
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
fimValidação com CNPJ
Combine XML.parsarNFe com a validação de CNPJ da stdlib de texto:
nota = XML.parsarNFe(xmlNFe)
se nao Texto.validarCNPJ(nota.cnpjEmitente)
erro "NF-e com CNPJ emitente inválido: " + nota.cnpjEmitente
fimParse manual (XML genérico)
<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>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)
fimCompatibilidade
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 (&, <). Para XMLs com essas construções em ambiente servidor, use uma biblioteca externa via HttpClient ou pré-processe o XML antes.