如何使用 Python 和 lxml 创建此 XML 结构?
<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4" xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd" Version="4.0" Fecha="2023-12-27T11:53:50">
<cfdi:Emisor Rfc="XAXX010101XXX" Nombre="COMPANY" RegimenFiscal="601"/>
<cfdi:Receptor Rfc="XEXX010101XXX" Nombre="COMPANY" DomicilioFiscalReceptor="00000" RegimenFiscalReceptor="601" UsoCFDI="G01"/>
<cfdi:Conceptos>
<cfdi:Concepto ClaveProdServ="00000000" NoIdentificacion="XXXXX" Cantidad="1.000000" ClaveUnidad="EA" Unidad="PIEZA" Descripcion="XXXXX" ValorUnitario="1.00" Importe="1.00" ObjetoImp="00">
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado Base="1.00" Importe="1.00" Impuesto="000" TipoFactor="Tasa" TasaOCuota="0.000000"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Concepto>
</cfdi:Conceptos>
<cfdi:Impuestos TotalImpuestosTrasladados="1.00">
<cfdi:Traslados>
<cfdi:Traslado Base="1.00" Importe="1.00" Impuesto="000" TipoFactor="Tasa" TasaOCuota="0.000000"/>
<cfdi:Traslado Base="1.00" Importe="1.00" Impuesto="000" TipoFactor="Tasa" TasaOCuota="0.000000"/>
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Comprobante>
此结构用于墨西哥发票。
使用 Powershell 脚本。我对这些值进行了硬编码。我也硬编码了总数。
using assembly System.Xml.Linq
$filename = 'c:\temp\test.xml'
$emisorRfc = 'XAXX010101XXX'
$receptorRfc = 'XEXX010101XXX'
$nombre = 'COMPANY'
$regimenFiscal = '601'
$domicilioFiscalReceptor = '00000'
$regimenFiscalReceptor = '601'
$usoCFDI = 'G01'
$claveProdServ = '00000000'
$noIdentificacion = 'XXXXX'
$cantidad = '1.000000'
$claveUnidad = 'EA'
$unidad = 'PIEZA'
$descripcion = 'XXXXX'
$valorUnitario = '1.00'
$importe = '1.00'
$objetoImp = '00'
$base = '1.00'
$importe = '1.00'
$impuesto = '000'
$tipoFactor = 'Tasa'
$tasaOCuota = '0.000000'
$ident = @'
<?xml version="1.0" encoding="utf-8"?>
<cfdi:Comprobante xmlns:cfdi="http://www.sat.gob.mx/cfd/4" xmlns:cce11="http://www.sat.gob.mx/ComercioExterior11" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd http://www.sat.gob.mx/ComercioExterior11 http://www.sat.gob.mx/sitio_internet/cfd/ComercioExterior11/ComercioExterior11.xsd" Version="4.0" Fecha="2023-12-27T11:53:50">
</cfdi:Comprobante>
'@
$xDoc = [System.Xml.Linq.XDocument]::Parse($ident)
$root = $xDoc.Root
$nscfdi = $root.GetNamespaceOfPrefix('cfdi')
$nscce11 = $root.GetNamespaceOfPrefix('cce11')
$nsxsi = $root.GetNamespaceOfPrefix('xsdi')
$emisor = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Emisor'))
$emisorRfcAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('RFC'), $emisorRfc)
$emisor.Add($emisorRfcAttr)
$emisorNombre = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Nombre'), $nombre)
$emisor.Add($emisorNombre)
$emisorRegimen = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('RegimenFiscal'), $regimenFiscal)
$emisor.Add($emisorRegimen)
$root.Add($emisor)
$receptor = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Receptor'))
$receptorRfcAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('RFC'), $receptorRfc)
$receptor.Add($receptorRfcAttr)
$receptor.Add($emisorNombre)
$receptorDomicilioFiscal = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('DomicilioFiscalReceptor'), $domicilioFiscalReceptor)
$receptor.Add($receptorDomicilioFiscal)
$receptorRegimenFiscal = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('RegimenFiscalReceptor'), $regimenFiscalReceptor)
$receptor.Add($receptorRegimenFiscal)
$receptorUsoCFDI = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('UsoCFDI'), $usoCFDI)
$receptor.Add($receptorUsoCFDI)
$root.Add($receptor)
$conceptos = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Conceptos'))
$concepto = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Concepto'))
$claveProdServAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('ClaveProdServ'), $claveProdServ)
$concepto.Add($claveProdServAttr)
$noIdentificacionAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('NoIdentificacion'), $noIdentificacion)
$concepto.Add($noIdentificacionAttr)
$cantidadAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Cantidad'), $cantidad)
$concepto.Add($cantidadAttr)
$claveUnidadAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('ClaveUnidad'), $claveUnidad)
$concepto.Add($claveUnidadAttr)
$unidadAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Unidad'), $unidad)
$concepto.Add($unidadAttr)
$descripcionAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Descripcion'), $descripcion)
$concepto.Add($descripcionAttr)
$valorUnitarioAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('ValorUnitario'), $valorUnitario)
$concepto.Add($valorUnitarioAttr)
$importeAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Importe'), $importe)
$concepto.Add($importeAttr)
$objetoImpAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('ObjetoImp'), $objetoImp)
$concepto.Add($objetoImpAttr)
$impuestos = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Impuestos'))
$traslados = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Traslados'))
$traslado = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Traslado'))
$baseAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Base'), $base)
$traslado.Add($baseAttr)
$importeAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Importe'), $importe)
$traslado.Add($importeAttr)
$impuestoAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('Impuesto'), $impuesto)
$traslado.Add($impuestoAttr)
$tipoFactorAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('TipoFactor'), $tipoFactor)
$traslado.Add($tipoFactorAttr)
$tasaOCuotaAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('TasaOCuota'), $tasaOCuota)
$traslado.Add($tasaOCuotaAttr)
$traslados.Add($traslado)
$impuestos.Add($traslados)
$concepto.Add($impuestos)
$conceptos.Add($concepto)
$root.Add($conceptos)
$impuestos = [System.Xml.Linq.XElement]::new([System.Xml.Linq.XName]::Get($nscfdi + 'Impuestos'))
$totalImpuestosTrasladados = '1.00'
$totalImpuestosTrasladadosAttr = [System.Xml.Linq.XAttribute]::new([System.Xml.Linq.XName]::Get('TotalImpuestosTrasladados'), $totalImpuestosTrasladados)
$impuestos.Add($totalImpuestosTrasladadosAttr)
$root.Add($impuestos)
$xDoc.Save($filename)