Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Python (https://www.clubdelphi.com/foros/forumdisplay.php?f=46)
-   -   Como leer nodo de archivo xml con Python usando minidom (https://www.clubdelphi.com/foros/showthread.php?t=92815)

jourdan 09-02-2018 03:25:19

Como leer nodo de archivo xml con Python usando minidom
 
tengo u archivo xml con la siguiente estructura:

<?xml version="1.0" encoding="UTF-8"?><cfdi:Comprobante Version="3.3" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv33.xsd " Serie="KNS" Folio="44" Fecha="2018-02-01T09:19:56" NoCertificado="00001000000407880000" Certificado="MIIGMzCCBBug...."" Moneda="MXN" TipoDeComprobante="I" MetodoPago="PUE" FormaPago="99" CondicionesDePago="Contado" SubTotal="540.00" Total="626.40" LugarExpedicion="11320" Sello="JKVJ""><cfdi:Emisor Rfc="GKM060127GP4" Nombre="GRUPO KROME DE MEXICO, SA DE CV" RegimenFiscal="601"/>
<cfdi:Receptor Rfc="IBS000800000" Nombre="IB Sistemas, S.A. de C.V." UsoCFDI="G03"/>
<cfdi:Conceptos><cfdi:Concepto ClaveProdServ="82101500" Cantidad="2.00" ClaveUnidad="HC" Descripcion="Tarjetas de presentación, impresas en offset digital." ValorUnitario="270.00" Importe="540.00"><cfdi:Impuestos><cfdi:Traslados><cfdi:Traslado Base="540.00" Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="86.40"/></cfdi:Traslados></cfdi:Impuestos></cfdi:Concepto></cfdi:Conceptos><cfdi:Impuestos TotalImpuestosTrasladados="86.40"> <cfdi:Traslados><cfdi:Traslado Impuesto="002" TipoFactor="Tasa" TasaOCuota="0.160000" Importe="86.40"/></cfdi:Traslados> </cfdi:Impuestos><cfdi:Complemento><tfd:TimbreFiscalDigital xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/sitio_internet/cfd/TimbreFiscalDigital/TimbreFiscalDigitalv11.xsd" Version="1.1" UUID="5CA56521-0763-11E8-87CC-00155D014007" FechaTimbrado="2018-02-01T09:19:57" RfcProvCertif="TBN040609RKA" SelloCFD="JKVJ"" NoCertificadoSAT="00001000000403557578" SelloSAT="jXmC54X9fW""/></cfdi:Complemento></cfdi:Comprobante>

Del cual quiero obtener el valor "totalImpuestosTrasladados" pero no lo he logrado.

Usando "getElementsByTagName" he logrado obtener la mayoría de los campos pero no lo he logrado con este.

Agradeceré cualquier ayuda

Gracias y saludos

tsk 09-02-2018 19:55:28

Sólo uno de los nodos de cfdi:Impuestos contiene el atributo TotalImpuestosTrasladados

esto bastaría para encontrar cual de ellos tiene el atributo.

Código:

for node in dom.getElementsByTagName("cfdi:Impuestos"):
    print node.getAttribute("TotalImpuestosTrasladados")

Aunque con lxml.etree y algo de xpath podrías hacer lo mismos.

Código:

from xml.dom.minidom import parse, parseString
from lxml import etree as ET

dom = parse("cfdi.xml")

print("-------------------------")

for node in dom.getElementsByTagName("cfdi:Impuestos"):
    print(node.getAttribute("TotalImpuestosTrasladados"))

#Con lxml.etree

d = ET.parse("cfdi.xml")

ns = {"cfdi":"h t t p : / / www . sat.gob.mx / cfd / 3"}
print("-------------------------")
#---------------------------
node = d.findall("//{h t t p : / / www . sat.gob.mx / cfd / 3}Impuestos/[@TotalImpuestosTrasladados]")[0]

for key,val in node.items():
    print(key,val)

print(node.xpath("@TotalImpuestosTrasladados")[0])

#---------------------------
print("--------------------------")
node = d.findall("//cfdi:Impuestos/[@TotalImpuestosTrasladados]",ns)[0]

for key,val in node.items():
    print(key,val)

print(node.xpath("@TotalImpuestosTrasladados")[0])

#---------------------------
print("----------------------------")
E = ET.XPathEvaluator(d,namespaces=ns)

print(E("//cfdi:Impuestos/@TotalImpuestosTrasladados")[0])

Sólo elimina los espacios en h t t p : / / www . sat.gob.mx / cfd / 3 y debe de funcionar.

De ejemplo use uno de los XML que vienen en la página del SAT y el resultado es el siguiente.

Código:

-------------------------



363104
-------------------------
('TotalImpuestosRetenidos', '1196492')
('TotalImpuestosTrasladados', '363104')
363104
--------------------------
('TotalImpuestosRetenidos', '1196492')
('TotalImpuestosTrasladados', '363104')
363104
----------------------------
363104


jourdan 09-02-2018 22:09:28

Muchisimas gracias, me pongo a hacer pruebas en este momento!
Saludos

jourdan 09-02-2018 22:23:16

Me funciono muy bien!
Muchismas gracias


La franja horaria es GMT +2. Ahora son las 15:58:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi