toXml()
Serializa un documento en cualquier etapa (creado, timbrado o firmado) a XML según el esquema del SII.
Uso básico#
import { toXml } from 'dte-sdk'
const xml = toXml(dte, { pretty: true })Para la factura de createDte(), eso produce:
<?xml version="1.0" encoding="ISO-8859-1"?>
<DTE version="1.0">
<Documento ID="F1024T33">
<Encabezado>
<IdDoc>
<TipoDTE>33</TipoDTE>
<Folio>1024</Folio>
<FchEmis>2026-10-28</FchEmis>
</IdDoc>
<Emisor>
<RUTEmisor>76123456-0</RUTEmisor>
<RznSoc>Arrow Software SpA</RznSoc>
<GiroEmis>Desarrollo de software</GiroEmis>
<Acteco>620200</Acteco>
<DirOrigen>Av. Providencia 1234</DirOrigen>
<CmnaOrigen>Providencia</CmnaOrigen>
</Emisor>
<Receptor>
<RUTRecep>77654321-7</RUTRecep>
<RznSocRecep>Comercial Los Andes Ltda.</RznSocRecep>
<GiroRecep>Comercio al por menor</GiroRecep>
<DirRecep>Huérfanos 1055</DirRecep>
<CmnaRecep>Santiago</CmnaRecep>
</Receptor>
<Totales>
<MntNeto>120000</MntNeto>
<TasaIVA>19</TasaIVA>
<IVA>22800</IVA>
<MntTotal>142800</MntTotal>
</Totales>
</Encabezado>
<Detalle>
<NroLinDet>1</NroLinDet>
<NmbItem>Licencia anual</NmbItem>
<QtyItem>1</QtyItem>
<PrcItem>120000</PrcItem>
<MontoItem>120000</MontoItem>
</Detalle>
</Documento>
</DTE>Firma de tipo#
function toXml(
doc: Dte | StampedDte | SignedDte,
options?: { pretty?: boolean; encoding?: 'ISO-8859-1' | 'UTF-8' },
): stringParámetros#
doc(Dte | StampedDte | SignedDte) - Un documento en cualquier etapa del ciclo de vida.options(opcional)pretty(boolean, por defecto:false) - Indenta la salida para leerla. Se ignora en documentos firmados (ver más abajo).encoding('ISO-8859-1' | 'UTF-8', por defecto:'ISO-8859-1') - La codificación que se declara en el XML. El valor por defecto es el que espera el SII.
Valor de retorno#
Retorna el XML como string. Lo que contiene depende de la etapa:
| Entrada | Salida |
|---|---|
Dte | El <DTE> con su <Documento>: encabezado, totales y líneas de detalle. Útil para previsualizar y para tests, no para enviar. |
StampedDte | Lo mismo, más el timbre <TED> y su marca de tiempo dentro de <Documento>. |
SignedDte | El documento final firmado, con la <Signature> XMLDSig. Idéntico a signed.xml. |
toXml() no lanza errores con documentos construidos con dte-sdk: ya fueron validados por createDte().
Documentos firmados#
Una firma cubre exactamente los bytes que firmó. Reindentar un documento
firmado lo invalidaría, así que pretty se ignora en un SignedDte y
siempre obtienes el documento tal como se firmó.
Codificación#
Un string de JavaScript no tiene codificación propia. La opción encoding solo define la declaración del XML, así que codifica los bytes de forma coherente al escribir el archivo o enviarlo por HTTP:
import { writeFile } from 'node:fs/promises'
import { toXml } from 'dte-sdk'
// ISO-8859-1 (default): write the bytes as latin1
await writeFile(`dte-33-${signed.folio}.xml`, toXml(signed), 'latin1')
// UTF-8: the declaration says UTF-8, write it as UTF-8
await writeFile('preview.xml', toXml(dte, { encoding: 'UTF-8' }), 'utf8')Escribir por error un XML ISO-8859-1 como UTF-8 deja ilegibles los caracteres con tilde, como la é de Huérfanos.
Ejemplos#
Archivar lo que enviaste#
Guarda el XML firmado de cada documento que emites, junto con su track ID:
import { sendToSii, toXml } from 'dte-sdk'
const { trackId } = await sendToSii(signed, siiOptions)
await db.documents.insert({
type: signed.type,
folio: signed.folio,
trackId,
xml: toXml(signed),
})Previsualizar un borrador#
import { createDte, toXml } from 'dte-sdk'
const draft = createDte(input)
console.log(toXml(draft, { pretty: true, encoding: 'UTF-8' }))Tests de snapshot#
import { createDte, stampDte, toXml } from 'dte-sdk'
test('invoice 1024 serializes as expected', () => {
const stamped = stampDte(createDte(input), caf, {
stampedAt: new Date('2026-10-28T10:15:00-03:00'),
})
expect(toXml(stamped, { pretty: true })).toMatchSnapshot()
})Funciones relacionadas#
createDte()- Construye el documentostampDte()- Agrega el<TED>signDte()- Agrega la firma;signed.xmles igual atoXml(signed)