Saltar al contenido
dte-sdk

toXml()

Serializa un documento en cualquier etapa (creado, timbrado o firmado) a XML según el esquema del SII.

Uso básico#

TypeScript
import { toXml } from 'dte-sdk'
 
const xml = toXml(dte, { pretty: true })

Para la factura de createDte(), eso produce:

xml
<?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#

TypeScript
function toXml(
  doc: Dte | StampedDte | SignedDte,
  options?: { pretty?: boolean; encoding?: 'ISO-8859-1' | 'UTF-8' },
): string

Pará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:

EntradaSalida
DteEl <DTE> con su <Documento>: encabezado, totales y líneas de detalle. Útil para previsualizar y para tests, no para enviar.
StampedDteLo mismo, más el timbre <TED> y su marca de tiempo dentro de <Documento>.
SignedDteEl 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:

TypeScript
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:

TypeScript
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#

TypeScript
import { createDte, toXml } from 'dte-sdk'
 
const draft = createDte(input)
 
console.log(toXml(draft, { pretty: true, encoding: 'UTF-8' }))

Tests de snapshot#

TypeScript
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#