python - 如何将所有元素从 xml 检索到 pandas DataFrame?PYTHON
问题描述
这是我第一次问问题,提前谢谢!
因此,我正在尝试处理数百个具有非常特殊格式的 XML 文件(python 脚本、xml 输出、pandas 输出和下面的原始 XML)
通过剥离 CDATA 标记,我能够捕获 XML 的特定部分,这很棒,但现在我需要将提取的 XML 中的“detalles”项传递给 pandas 数据框。我尝试了很多方法并检查了不同的问题,但我仍然得到一个 NoneType,其中包含空单元格。
关于如何捕获所有数据的任何想法?谢谢!
这是我的代码:
from lxml import etree
import pandas as pd
root= etree.parse(r'Factura 2.xml')
root2 = etree.XML(etree.tostring(root))
invoice = root2[3]
print(invoice.text)#i see here under the tag deatlles , taht the invoice has items in it
new_xml = invoice.text
new_xml= new_xml.encode()#forces to encode XML to default encoding
roott=etree.XML(new_xml)
#pass data to pandas dataframe
data = []
cols = []
for i, child in enumerate(roott):
data.append([subchild.text for subchild in child])
cols.append(child.tag)
df = pd.DataFrame(data).T # Write in DF and transpose it
df.columns = cols # Update column names
df.to_excel('table.xlsx')
print(df)
这是输出:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><factura id="comprobante" version="2.1.0">
<infoTributaria>
<ambiente>2</ambiente>
<tipoEmision>1</tipoEmision>
<razonSocial>INVERNEG S.A.</razonSocial>
<ruc>0990658498001</ruc>
<claveAcceso>2201202101099065849800120030120000802950008029516</claveAcceso>
<codDoc>01</codDoc>
<estab>003</estab>
<ptoEmi>012</ptoEmi>
<secuencial>000080295</secuencial>
<dirMatriz>AV. DE LAS AMERICAS 807 Y CALLE SEGUNDA</dirMatriz>
</infoTributaria>
<infoFactura>
<fechaEmision>22/01/2021</fechaEmision>
<dirEstablecimiento>AV. 10 DE AGOSTO # 132 Y DE LOS CEREZOS</dirEstablecimiento>
<contribuyenteEspecial>136</contribuyenteEspecial>
<obligadoContabilidad>SI</obligadoContabilidad>
<tipoIdentificacionComprador>04</tipoIdentificacionComprador>
<razonSocialComprador>SANTOS ANDINO JOSE RODRIGO</razonSocialComprador>
<identificacionComprador>1704484185001</identificacionComprador>
<direccionComprador>AV. MARISCAL SUCRE S8-493 Y JOSE MENDOZA</direccionComprador>
<totalSinImpuestos>84.15</totalSinImpuestos>
<totalDescuento>0</totalDescuento>
<totalConImpuestos>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<descuentoAdicional>0.00</descuentoAdicional>
<baseImponible>84.15</baseImponible>
<tarifa>12.00</tarifa>
<valor>10.10</valor>
</totalImpuesto>
</totalConImpuestos>
<propina>0.00</propina>
<importeTotal>94.25</importeTotal>
<moneda>DOLAR</moneda>
<pagos>
<pago>
<formaPago>20</formaPago>
<total>94.25</total>
<plazo>30</plazo>
<unidadTiempo>Dias</unidadTiempo>
</pago>
</pagos>
</infoFactura>
<detalles>
<detalle>
<codigoPrincipal>SH6607-XPL</codigoPrincipal>
<descripcion>20K KM SYNTHETIC LF PH2876 Ford Mazda.</descripcion>
<cantidad>34.00</cantidad>
<precioUnitario>2.4750</precioUnitario>
<descuento>0.00</descuento>
<precioTotalSinImpuesto>84.15</precioTotalSinImpuesto>
<impuestos>
<impuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<tarifa>12.00</tarifa>
<baseImponible>84.15</baseImponible>
<valor>10.10</valor>
</impuesto>
</impuestos>
</detalle>
</detalles>
<infoAdicional>
<campoAdicional nombre="emailCliente">motozone25@gmail.com</campoAdicional>
<campoAdicional nombre="OrdenCompra">NN</campoAdicional>
<campoAdicional nombre="CodSociedad">Dynamics</campoAdicional>
<campoAdicional nombre="CodInternoSAP">ivn</campoAdicional>
</infoAdicional>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Id="Signature260661">
<ds:SignedInfo Id="Signature-SignedInfo959896">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference Id="SignedPropertiesID72112" Type="http://uri.etsi.org/01903#SignedProperties" URI="#Signature260661-SignedProperties267295">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>2XMqZGYiZj19+ASI+0cw/ZpY32U=</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#Certificate1621720">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>7ypTHELgqKKlA36P9wVJ8tB+LLY=</ds:DigestValue>
</ds:Reference>
<ds:Reference Id="Reference-ID-24390" URI="#comprobante">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>IMXyzVuehrGVc8DIwS/O7z+yiEs=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue Id="SignatureValue783577">
e7j105IptFmzcpMNYsbkrByTaMnV1XPmnyJ69dXCCfifwooEKpHxiNDlimPYcfQV7ZpLJ4V5g4H1
CtobnB9U/GgKQF1uQz6uCFzyvyxp3P6TBg5iJ2Tbv4txCWu7OZBlQmbeilqVOkV15KAbVPZlqdxJ
XkJPvqRxxOVoPzidRbGWCZR9Q19lNdNEV8yHz4AtkpMWl3JtRi1k7n4aRPFDl1PC7nhcLWIuDXuD
sImgREjbGzY+PBoBw48DlSyXM/eABSBtwuZESSmYcC9k8ZWmD59VuFUqz1bFgb4LxhMTWjzNlLf2
CmbplKnqGZfaE6Kp+h0tJi6+7PFdlhm+dGNaCg==
</ds:SignatureValue>
<ds:KeyInfo Id="Certificate1621720">
<ds:X509Data>
<ds:X509Certificate>
MIIKFzCCB/+gAwIBAgIEW2EYeTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCRUMxIjAgBgNV
BAoTGUJBTkNPIENFTlRSQUwgREVMIEVDVUFET1IxNzA1BgNVBAsTLkVOVElEQUQgREUgQ0VSVElG
SUNBQ0lPTiBERSBJTkZPUk1BQ0lPTi1FQ0lCQ0UxDjAMBgNVBAcTBVFVSVRPMSUwIwYDVQQDExxB
QyBCQU5DTyBDRU5UUkFMIERFTCBFQ1VBRE9SMB4XDTE5MDkyMzEzNDkyNFoXDTIxMDkyMzE0MTky
NFowgbYxCzAJBgNVBAYTAkVDMSIwIAYDVQQKExlCQU5DTyBDRU5UUkFMIERFTCBFQ1VBRE9SMTcw
NQYDVQQLEy5FTlRJREFEIERFIENFUlRJRklDQUNJT04gREUgSU5GT1JNQUNJT04tRUNJQkNFMQ4w
DAYDVQQHEwVRVUlUTzE6MBEGA1UEBRMKMDAwMDA5MTg5NjAlBgNVBAMTHkpVU1RPIEVOUklRVUUg
R09OWkFMRVogQUxNRUlEQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqyjftcUein
EL0FI3Sc2um7sr2dhfuSdOhPgZQPwr64/0Du9Uo475cqS4oD3QyW8m4HK2OFsqiJr7Pp9DmqyuON
YX6nWrq8sdlRKoSnML2MDGgmHvEjBc/ezq/04vpcT7i8BWXQoe2Pk3mI2mPIWoimv91eg5euPYvv
UX+cF44kNE3KSBGsPezFyOB1FglFQxG2wlm8s6Yl4TJqvjo6NpTErpesugXntNEq2tlPoOtPt4cw
9BQ/buh7oDIP1HA0ilTioXkNqPY88elJYheuKJI/lPWM2+fBeXNVjTV7SIqJrPM5R+A8GLlWDYge
vOle5W9pwLvbx3r1+KYToqoSsx8CAwEAAaOCBT4wggU6MAsGA1UdDwQEAwIHgDBnBgNVHSAEYDBe
MFwGCysGAQQBgqg7AgIBME0wSwYIKwYBBQUHAgEWP2h0dHA6Ly93d3cuZWNpLmJjZS5lYy9wb2xp
dGljYS1jZXJ0aWZpY2Fkby9wZXJzb25hLWp1cmlkaWNhLnBkZjCBkQYIKwYBBQUHAQEEgYQwgYEw
PgYIKwYBBQUHMAGGMmh0dHA6Ly9vY3NwLmVjaS5iY2UuZWMvZWpiY2EvcHVibGljd2ViL3N0YXR1
cy9vY3NwMD8GCCsGAQUFBzABhjNodHRwOi8vb2NzcDEuZWNpLmJjZS5lYy9lamJjYS9wdWJsaWN3
ZWIvc3RhdHVzL29jc3AwGwYKKwYBBAGCqDsDCgQNEwtJTlZFUk5FRyBTQTAdBgorBgEEAYKoOwML
BA8TDTA5OTA2NTg0OTgwMDEwGgYKKwYBBAGCqDsDAQQMEwowOTA1MzMxMTc5MB0GCisGAQQBgqg7
AwIEDxMNSlVTVE8gRU5SSVFVRTAYBgorBgEEAYKoOwMDBAoTCEdPTlpBTEVaMBcGCisGAQQBgqg7
AwQECRMHQUxNRUlEQTAaBgorBgEEAYKoOwMFBAwTClBSRVNJREVOVEUwOgYKKwYBBAGCqDsDBwQs
EypBViBERSBMQVMgIEFNRVJJQ0FTICAgODA3IFkgQ0FMTEUgIFNFR1VOREEwGQYKKwYBBAGCqDsD
CAQLEwkwNDI2OTA4MDAwGQYKKwYBBAGCqDsDCQQLEwlHdWF5YXF1aWwwFwYKKwYBBAGCqDsDDAQJ
EwdFQ1VBRE9SMB0GCisGAQQBgqg7AzIEDxMNMDk5MDY1ODQ5ODAwMTAgBgorBgEEAYKoOwMzBBIT
EFNPRlRXQVJFLUFSQ0hJVk8wJgYDVR0RBB8wHYEbanVzdG8uZ29uemFsZXpAaW52ZXJuZWcuY29t
MIIB3wYDVR0fBIIB1jCCAdIwggHOoIIByqCCAcaGgdVsZGFwOi8vYmNlcWxkYXBzdWJwMS5iY2Uu
ZWMvY249Q1JMODQyLGNuPUFDJTIwQkFOQ08lMjBDRU5UUkFMJTIwREVMJTIwRUNVQURPUixsPVFV
SVRPLG91PUVOVElEQUQlMjBERSUyMENFUlRJRklDQUNJT04lMjBERSUyMElORk9STUFDSU9OLUVD
SUJDRSxvPUJBTkNPJTIwQ0VOVFJBTCUyMERFTCUyMEVDVUFET1IsYz1FQz9jZXJ0aWZpY2F0ZVJl
dm9jYXRpb25MaXN0P2Jhc2WGNGh0dHA6Ly93d3cuZWNpLmJjZS5lYy9DUkwvZWNpX2JjZV9lY19j
cmxmaWxlY29tYi5jcmykgbUwgbIxCzAJBgNVBAYTAkVDMSIwIAYDVQQKExlCQU5DTyBDRU5UUkFM
IERFTCBFQ1VBRE9SMTcwNQYDVQQLEy5FTlRJREFEIERFIENFUlRJRklDQUNJT04gREUgSU5GT1JN
QUNJT04tRUNJQkNFMQ4wDAYDVQQHEwVRVUlUTzElMCMGA1UEAxMcQUMgQkFOQ08gQ0VOVFJBTCBE
RUwgRUNVQURPUjEPMA0GA1UEAxMGQ1JMODQyMCsGA1UdEAQkMCKADzIwMTkwOTIzMTM0OTI0WoEP
MjAyMTA5MjMxNDE5MjRaMB8GA1UdIwQYMBaAFEii3yMfHfgsUXqMA81JMqUJwZSrMB0GA1UdDgQW
BBRo1dATwJqFbr5m83H1ebKUyJ296jAJBgNVHRMEAjAAMBkGCSqGSIb2fQdBAAQMMAobBFY4LjED
AgSwMA0GCSqGSIb3DQEBCwUAA4ICAQA5UfSwQYbsGAz9Ygq6AoBVFBvzrbG/ebqTM7DCnPh9C6vN
EgZ2LqfWENb05h0AdP+6lhVz6RXBhMKnoh9bfJkTDbBj6SOxOQkiVueUgrTHJOm45sTW2Rd6Sv/M
y7wleKR6muSWGOSILXvp3zxPjHklMfTRMsAYDpzRY0OhpOzKreJWXeI/BxAxrPW/D18BjwojKjeu
SsNd8PSMmye8ACJtZ05C6cZcljtM0Fu3YGRCW5rLR2U79OtKq7FFSGyPwXdzK5b4E0WgbHcEMmkY
h7n0IWxdhOyzfHdMGE+5NHef07/EWRKgyadtw6/TR4bcoXBBPyysvzmySx0iiAw0OGhLl86vxAC2
4Tj705j2LMYbIPrzUUuYQEpJ+FCwF6/n/DxYgjwURCIEq6GSSWRAdOXUVWgHoNfGRQ9I6K8BsFsI
6PKHZZ56SCwq/RvWwlpe2r622IunN9QiMgMt1WeYmVK4EzSiOh6Vr2tUyyYE3F9n2s+FEwXCtV/l
acFyRyoPopQo53Sj+BjanHAZ6NmMAqpDUgc8ZhSCXQ3U0OZlZGtxAjxtkoSPbdqMj+YeL4Ummo+I
85Cjcw4sBYSLjaPeQzEp5xYVI9Zxec4j3w6dygHv3z4rzjX7Hp5FT3gorEGgoB7Chwf6/O/tOhNJ
IHnbaAIJCeOVwlLyRJUAxRKagkcA8w==
</ds:X509Certificate>
</ds:X509Data>
<ds:KeyValue>
<ds:RSAKeyValue>
<ds:Modulus>
yrKN+1xR6KcQvQUjdJza6buyvZ2F+5J06E+BlA/Cvrj/QO71SjjvlypLigPdDJbybgcrY4WyqImv
s+n0OarK441hfqdauryx2VEqhKcwvYwMaCYe8SMFz97Or/Ti+lxPuLwFZdCh7Y+TeYjaY8haiKa/
3V6Dl649i+9Rf5wXjiQ0TcpIEaw97MXI4HUWCUVDEbbCWbyzpiXhMmq+Ojo2lMSul6y6Bee00Sra
2U+g60+3hzD0FD9u6HugMg/UcDSKVOKheQ2o9jzx6UliF64okj+U9Yzb58F5c1WNNXtIioms8zlH
4DwYuVYNiB686V7lb2nAu9vHevX4phOiqhKzHw==
</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
</ds:KeyInfo>
<ds:Object Id="Signature260661-Object151833"><etsi:QualifyingProperties Target="#Signature260661"><etsi:SignedProperties Id="Signature260661-SignedProperties267295"><etsi:SignedSignatureProperties><etsi:SigningTime>2021-01-22T17:39:56-05:00</etsi:SigningTime><etsi:SigningCertificate><etsi:Cert><etsi:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>m1xycXw93GXwQi44F/n8Fr4r2TM=</ds:DigestValue></etsi:CertDigest><etsi:IssuerSerial><ds:X509IssuerName>CN=AC BANCO CENTRAL DEL ECUADOR,L=QUITO,OU=ENTIDAD DE CERTIFICACION DE INFORMACION-ECIBCE,O=BANCO CENTRAL DEL ECUADOR,C=EC</ds:X509IssuerName><ds:X509SerialNumber>1533089913</ds:X509SerialNumber></etsi:IssuerSerial></etsi:Cert></etsi:SigningCertificate></etsi:SignedSignatureProperties><etsi:SignedDataObjectProperties><etsi:DataObjectFormat ObjectReference="#Reference-ID-24390"><etsi:Description>comprobante</etsi:Description><etsi:MimeType>text/xml</etsi:MimeType></etsi:DataObjectFormat></etsi:SignedDataObjectProperties></etsi:SignedProperties></etsi:QualifyingProperties></ds:Object></ds:Signature></factura>
infoTributaria ... {http://www.w3.org/2000/09/xmldsig#}Signature
0 2 ... \n
1 1 ... \ne7j105IptFmzcpMNYsbkrByTaMnV1XPmnyJ69dXCCfif...
2 INVERNEG S.A. ... \n
3 0990658498001 ... None
4 2201202101099065849800120030120000802950008029516 ... None
5 01 ... None
6 003 ... None
7 012 ... None
8 000080295 ... None
9 AV. DE LAS AMERICAS 807 Y CALLE SEGUNDA ... None
10 None ... None
11 None ... None
12 None ... None
13 None ... None
14 None ... None
[15 rows x 5 columns]
>>>
原始 XML
<autorizacion><estado>PENDIENTE</estado><numeroAutorizacion>2201202101099065849800120030120000802950008029516</numeroAutorizacion><ambiente>PRODUCCIÓN</ambiente><comprobante><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="no"?><factura id="comprobante" version="2.1.0">
<infoTributaria>
<ambiente>2</ambiente>
<tipoEmision>1</tipoEmision>
<razonSocial>INVERNEG S.A.</razonSocial>
<ruc>0990658498001</ruc>
<claveAcceso>2201202101099065849800120030120000802950008029516</claveAcceso>
<codDoc>01</codDoc>
<estab>003</estab>
<ptoEmi>012</ptoEmi>
<secuencial>000080295</secuencial>
<dirMatriz>AV. DE LAS AMERICAS 807 Y CALLE SEGUNDA</dirMatriz>
</infoTributaria>
<infoFactura>
<fechaEmision>22/01/2021</fechaEmision>
<dirEstablecimiento>AV. 10 DE AGOSTO # 132 Y DE LOS CEREZOS</dirEstablecimiento>
<contribuyenteEspecial>136</contribuyenteEspecial>
<obligadoContabilidad>SI</obligadoContabilidad>
<tipoIdentificacionComprador>04</tipoIdentificacionComprador>
<razonSocialComprador>SANTOS ANDINO JOSE RODRIGO</razonSocialComprador>
<identificacionComprador>1704484185001</identificacionComprador>
<direccionComprador>AV. MARISCAL SUCRE S8-493 Y JOSE MENDOZA</direccionComprador>
<totalSinImpuestos>84.15</totalSinImpuestos>
<totalDescuento>0</totalDescuento>
<totalConImpuestos>
<totalImpuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<descuentoAdicional>0.00</descuentoAdicional>
<baseImponible>84.15</baseImponible>
<tarifa>12.00</tarifa>
<valor>10.10</valor>
</totalImpuesto>
</totalConImpuestos>
<propina>0.00</propina>
<importeTotal>94.25</importeTotal>
<moneda>DOLAR</moneda>
<pagos>
<pago>
<formaPago>20</formaPago>
<total>94.25</total>
<plazo>30</plazo>
<unidadTiempo>Dias</unidadTiempo>
</pago>
</pagos>
</infoFactura>
<detalles>
<detalle>
<codigoPrincipal>SH6607-XPL</codigoPrincipal>
<descripcion>20K KM SYNTHETIC LF PH2876 Ford Mazda.</descripcion>
<cantidad>34.00</cantidad>
<precioUnitario>2.4750</precioUnitario>
<descuento>0.00</descuento>
<precioTotalSinImpuesto>84.15</precioTotalSinImpuesto>
<impuestos>
<impuesto>
<codigo>2</codigo>
<codigoPorcentaje>2</codigoPorcentaje>
<tarifa>12.00</tarifa>
<baseImponible>84.15</baseImponible>
<valor>10.10</valor>
</impuesto>
</impuestos>
</detalle>
</detalles>
<infoAdicional>
<campoAdicional nombre="emailCliente">motozone25@gmail.com</campoAdicional>
<campoAdicional nombre="OrdenCompra">NN</campoAdicional>
<campoAdicional nombre="CodSociedad">Dynamics</campoAdicional>
<campoAdicional nombre="CodInternoSAP">ivn</campoAdicional>
</infoAdicional>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:etsi="http://uri.etsi.org/01903/v1.3.2#" Id="Signature260661">
<ds:SignedInfo Id="Signature-SignedInfo959896">
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference Id="SignedPropertiesID72112" Type="http://uri.etsi.org/01903#SignedProperties" URI="#Signature260661-SignedProperties267295">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>2XMqZGYiZj19+ASI+0cw/ZpY32U=</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#Certificate1621720">
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>7ypTHELgqKKlA36P9wVJ8tB+LLY=</ds:DigestValue>
</ds:Reference>
<ds:Reference Id="Reference-ID-24390" URI="#comprobante">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>IMXyzVuehrGVc8DIwS/O7z+yiEs=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue Id="SignatureValue783577">
e7j105IptFmzcpMNYsbkrByTaMnV1XPmnyJ69dXCCfifwooEKpHxiNDlimPYcfQV7ZpLJ4V5g4H1
CtobnB9U/GgKQF1uQz6uCFzyvyxp3P6TBg5iJ2Tbv4txCWu7OZBlQmbeilqVOkV15KAbVPZlqdxJ
XkJPvqRxxOVoPzidRbGWCZR9Q19lNdNEV8yHz4AtkpMWl3JtRi1k7n4aRPFDl1PC7nhcLWIuDXuD
sImgREjbGzY+PBoBw48DlSyXM/eABSBtwuZESSmYcC9k8ZWmD59VuFUqz1bFgb4LxhMTWjzNlLf2
CmbplKnqGZfaE6Kp+h0tJi6+7PFdlhm+dGNaCg==
</ds:SignatureValue>
<ds:KeyInfo Id="Certificate1621720">
<ds:X509Data>
<ds:X509Certificate>
MIIKFzCCB/+gAwIBAgIEW2EYeTANBgkqhkiG9w0BAQsFADCBoTELMAkGA1UEBhMCRUMxIjAgBgNV
BAoTGUJBTkNPIENFTlRSQUwgREVMIEVDVUFET1IxNzA1BgNVBAsTLkVOVElEQUQgREUgQ0VSVElG
SUNBQ0lPTiBERSBJTkZPUk1BQ0lPTi1FQ0lCQ0UxDjAMBgNVBAcTBVFVSVRPMSUwIwYDVQQDExxB
QyBCQU5DTyBDRU5UUkFMIERFTCBFQ1VBRE9SMB4XDTE5MDkyMzEzNDkyNFoXDTIxMDkyMzE0MTky
NFowgbYxCzAJBgNVBAYTAkVDMSIwIAYDVQQKExlCQU5DTyBDRU5UUkFMIERFTCBFQ1VBRE9SMTcw
NQYDVQQLEy5FTlRJREFEIERFIENFUlRJRklDQUNJT04gREUgSU5GT1JNQUNJT04tRUNJQkNFMQ4w
DAYDVQQHEwVRVUlUTzE6MBEGA1UEBRMKMDAwMDA5MTg5NjAlBgNVBAMTHkpVU1RPIEVOUklRVUUg
R09OWkFMRVogQUxNRUlEQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMqyjftcUein
EL0FI3Sc2um7sr2dhfuSdOhPgZQPwr64/0Du9Uo475cqS4oD3QyW8m4HK2OFsqiJr7Pp9DmqyuON
YX6nWrq8sdlRKoSnML2MDGgmHvEjBc/ezq/04vpcT7i8BWXQoe2Pk3mI2mPIWoimv91eg5euPYvv
UX+cF44kNE3KSBGsPezFyOB1FglFQxG2wlm8s6Yl4TJqvjo6NpTErpesugXntNEq2tlPoOtPt4cw
9BQ/buh7oDIP1HA0ilTioXkNqPY88elJYheuKJI/lPWM2+fBeXNVjTV7SIqJrPM5R+A8GLlWDYge
vOle5W9pwLvbx3r1+KYToqoSsx8CAwEAAaOCBT4wggU6MAsGA1UdDwQEAwIHgDBnBgNVHSAEYDBe
MFwGCysGAQQBgqg7AgIBME0wSwYIKwYBBQUHAgEWP2h0dHA6Ly93d3cuZWNpLmJjZS5lYy9wb2xp
dGljYS1jZXJ0aWZpY2Fkby9wZXJzb25hLWp1cmlkaWNhLnBkZjCBkQYIKwYBBQUHAQEEgYQwgYEw
PgYIKwYBBQUHMAGGMmh0dHA6Ly9vY3NwLmVjaS5iY2UuZWMvZWpiY2EvcHVibGljd2ViL3N0YXR1
cy9vY3NwMD8GCCsGAQUFBzABhjNodHRwOi8vb2NzcDEuZWNpLmJjZS5lYy9lamJjYS9wdWJsaWN3
ZWIvc3RhdHVzL29jc3AwGwYKKwYBBAGCqDsDCgQNEwtJTlZFUk5FRyBTQTAdBgorBgEEAYKoOwML
BA8TDTA5OTA2NTg0OTgwMDEwGgYKKwYBBAGCqDsDAQQMEwowOTA1MzMxMTc5MB0GCisGAQQBgqg7
AwIEDxMNSlVTVE8gRU5SSVFVRTAYBgorBgEEAYKoOwMDBAoTCEdPTlpBTEVaMBcGCisGAQQBgqg7
AwQECRMHQUxNRUlEQTAaBgorBgEEAYKoOwMFBAwTClBSRVNJREVOVEUwOgYKKwYBBAGCqDsDBwQs
EypBViBERSBMQVMgIEFNRVJJQ0FTICAgODA3IFkgQ0FMTEUgIFNFR1VOREEwGQYKKwYBBAGCqDsD
CAQLEwkwNDI2OTA4MDAwGQYKKwYBBAGCqDsDCQQLEwlHdWF5YXF1aWwwFwYKKwYBBAGCqDsDDAQJ
EwdFQ1VBRE9SMB0GCisGAQQBgqg7AzIEDxMNMDk5MDY1ODQ5ODAwMTAgBgorBgEEAYKoOwMzBBIT
EFNPRlRXQVJFLUFSQ0hJVk8wJgYDVR0RBB8wHYEbanVzdG8uZ29uemFsZXpAaW52ZXJuZWcuY29t
MIIB3wYDVR0fBIIB1jCCAdIwggHOoIIByqCCAcaGgdVsZGFwOi8vYmNlcWxkYXBzdWJwMS5iY2Uu
ZWMvY249Q1JMODQyLGNuPUFDJTIwQkFOQ08lMjBDRU5UUkFMJTIwREVMJTIwRUNVQURPUixsPVFV
SVRPLG91PUVOVElEQUQlMjBERSUyMENFUlRJRklDQUNJT04lMjBERSUyMElORk9STUFDSU9OLUVD
SUJDRSxvPUJBTkNPJTIwQ0VOVFJBTCUyMERFTCUyMEVDVUFET1IsYz1FQz9jZXJ0aWZpY2F0ZVJl
dm9jYXRpb25MaXN0P2Jhc2WGNGh0dHA6Ly93d3cuZWNpLmJjZS5lYy9DUkwvZWNpX2JjZV9lY19j
cmxmaWxlY29tYi5jcmykgbUwgbIxCzAJBgNVBAYTAkVDMSIwIAYDVQQKExlCQU5DTyBDRU5UUkFM
IERFTCBFQ1VBRE9SMTcwNQYDVQQLEy5FTlRJREFEIERFIENFUlRJRklDQUNJT04gREUgSU5GT1JN
QUNJT04tRUNJQkNFMQ4wDAYDVQQHEwVRVUlUTzElMCMGA1UEAxMcQUMgQkFOQ08gQ0VOVFJBTCBE
RUwgRUNVQURPUjEPMA0GA1UEAxMGQ1JMODQyMCsGA1UdEAQkMCKADzIwMTkwOTIzMTM0OTI0WoEP
MjAyMTA5MjMxNDE5MjRaMB8GA1UdIwQYMBaAFEii3yMfHfgsUXqMA81JMqUJwZSrMB0GA1UdDgQW
BBRo1dATwJqFbr5m83H1ebKUyJ296jAJBgNVHRMEAjAAMBkGCSqGSIb2fQdBAAQMMAobBFY4LjED
AgSwMA0GCSqGSIb3DQEBCwUAA4ICAQA5UfSwQYbsGAz9Ygq6AoBVFBvzrbG/ebqTM7DCnPh9C6vN
EgZ2LqfWENb05h0AdP+6lhVz6RXBhMKnoh9bfJkTDbBj6SOxOQkiVueUgrTHJOm45sTW2Rd6Sv/M
y7wleKR6muSWGOSILXvp3zxPjHklMfTRMsAYDpzRY0OhpOzKreJWXeI/BxAxrPW/D18BjwojKjeu
SsNd8PSMmye8ACJtZ05C6cZcljtM0Fu3YGRCW5rLR2U79OtKq7FFSGyPwXdzK5b4E0WgbHcEMmkY
h7n0IWxdhOyzfHdMGE+5NHef07/EWRKgyadtw6/TR4bcoXBBPyysvzmySx0iiAw0OGhLl86vxAC2
4Tj705j2LMYbIPrzUUuYQEpJ+FCwF6/n/DxYgjwURCIEq6GSSWRAdOXUVWgHoNfGRQ9I6K8BsFsI
6PKHZZ56SCwq/RvWwlpe2r622IunN9QiMgMt1WeYmVK4EzSiOh6Vr2tUyyYE3F9n2s+FEwXCtV/l
acFyRyoPopQo53Sj+BjanHAZ6NmMAqpDUgc8ZhSCXQ3U0OZlZGtxAjxtkoSPbdqMj+YeL4Ummo+I
85Cjcw4sBYSLjaPeQzEp5xYVI9Zxec4j3w6dygHv3z4rzjX7Hp5FT3gorEGgoB7Chwf6/O/tOhNJ
IHnbaAIJCeOVwlLyRJUAxRKagkcA8w==
</ds:X509Certificate>
</ds:X509Data>
<ds:KeyValue>
<ds:RSAKeyValue>
<ds:Modulus>
yrKN+1xR6KcQvQUjdJza6buyvZ2F+5J06E+BlA/Cvrj/QO71SjjvlypLigPdDJbybgcrY4WyqImv
s+n0OarK441hfqdauryx2VEqhKcwvYwMaCYe8SMFz97Or/Ti+lxPuLwFZdCh7Y+TeYjaY8haiKa/
3V6Dl649i+9Rf5wXjiQ0TcpIEaw97MXI4HUWCUVDEbbCWbyzpiXhMmq+Ojo2lMSul6y6Bee00Sra
2U+g60+3hzD0FD9u6HugMg/UcDSKVOKheQ2o9jzx6UliF64okj+U9Yzb58F5c1WNNXtIioms8zlH
4DwYuVYNiB686V7lb2nAu9vHevX4phOiqhKzHw==
</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
</ds:KeyInfo>
<ds:Object Id="Signature260661-Object151833"><etsi:QualifyingProperties Target="#Signature260661"><etsi:SignedProperties Id="Signature260661-SignedProperties267295"><etsi:SignedSignatureProperties><etsi:SigningTime>2021-01-22T17:39:56-05:00</etsi:SigningTime><etsi:SigningCertificate><etsi:Cert><etsi:CertDigest><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>m1xycXw93GXwQi44F/n8Fr4r2TM=</ds:DigestValue></etsi:CertDigest><etsi:IssuerSerial><ds:X509IssuerName>CN=AC BANCO CENTRAL DEL ECUADOR,L=QUITO,OU=ENTIDAD DE CERTIFICACION DE INFORMACION-ECIBCE,O=BANCO CENTRAL DEL ECUADOR,C=EC</ds:X509IssuerName><ds:X509SerialNumber>1533089913</ds:X509SerialNumber></etsi:IssuerSerial></etsi:Cert></etsi:SigningCertificate></etsi:SignedSignatureProperties><etsi:SignedDataObjectProperties><etsi:DataObjectFormat ObjectReference="#Reference-ID-24390"><etsi:Description>comprobante</etsi:Description><etsi:MimeType>text/xml</etsi:MimeType></etsi:DataObjectFormat></etsi:SignedDataObjectProperties></etsi:SignedProperties></etsi:QualifyingProperties></ds:Object></ds:Signature></factura>]]></comprobante></autorizacion>
解决方案
这只是部分解决方案。
编辑:
我添加了使用递归来获取所有孩子、子孩子等的版本。
所以现在它似乎是完整的解决方案。
首先:find('detalle')
搜索直接子'detalle'
节点但不嵌套在其他节点中 - 即。在'detalles'
. 您需要在所有节点中搜索xpath
。.//
detalle = tree.find('.//detalle')
第二:subchild.text for subchild in child
在直接子项中搜索文本,但没有得到直接文本 - 即。in <codigoPrincipal>
- 并且它不会从嵌套的子项中获取文本 - 即。在<impuestos>
.
因为<codigoPrincipal>
您必须直接获取,child.text
但<impuestos>
您必须使用递归创建嵌套循环或函数。而且这个循环/递归在我的解决方案中还没有解决。
代码:
from lxml import etree
import pandas as pd
tree = etree.parse('Factura 2.xml')
#root = tree.getroot() # I don't need it. I can use directly `tree.find()`
invoice = tree.find('comprobante') # instead of `root[3]
tree = etree.XML(invoice.text.encode())
detalle = tree.find('.//detalle') # need `.//` to get nested element
# pass data to pandas dataframe (PEP8: one space after `#`)
data = dict()
print('--- children ---')
for child in detalle:
column = child.tag
text = child.text.strip()
data[column] = [text]
print(column, '=', text)
print('--- DataFrame ---')
df = pd.DataFrame(data).T # Write in DF and transpose it (PEP8: two spaces before `#`)
#df.to_excel('table.xlsx')
print(df)
结果:
--- children ---
codigoPrincipal = SH6607-XPL
descripcion = 20K KM SYNTHETIC LF PH2876 Ford Mazda.
cantidad = 34.00
precioUnitario = 2.4750
descuento = 0.00
precioTotalSinImpuesto = 84.15
impuestos =
--- DataFrame ---
0
codigoPrincipal SH6607-XPL
descripcion 20K KM SYNTHETIC LF PH2876 Ford Mazda.
cantidad 34.00
precioUnitario 2.4750
descuento 0.00
precioTotalSinImpuesto 84.15
impuestos
它没有检查嵌套节点impuestos
编辑:
使用递归获取所有children
andsubchildren
和subsubchildren
等的版本。
from lxml import etree
import pandas as pd
# --- functions ---
def get_all_children(node):
data = dict()
for child in node:
tag = child.tag
text = child.text
if text:
text = text.strip()
if text:
data[tag] = [text]
data.update(get_all_children(child))
return data
# --- main ---
tree = etree.parse('Factura 2.xml')
#root = tree.getroot()
invoice = tree.find('comprobante')
tree = etree.XML(invoice.text.encode())
detalle = tree.find('.//detalle') # need `.//` to get nested element
print('--- children ---')
# data = get_all_children(tree)
data = get_all_children(detalle)
for key, value in data.items():
print(key, '=', value)
print('--- DataFrame ---')
df = pd.DataFrame(data).T
print(df)
结果get_all_children(detalle)
:
--- children ---
codigoPrincipal = ['SH6607-XPL']
descripcion = ['20K KM SYNTHETIC LF PH2876 Ford Mazda.']
cantidad = ['34.00']
precioUnitario = ['2.4750']
descuento = ['0.00']
precioTotalSinImpuesto = ['84.15']
codigo = ['2']
codigoPorcentaje = ['2']
tarifa = ['12.00']
baseImponible = ['84.15']
valor = ['10.10']
--- DataFrame ---
0
codigoPrincipal SH6607-XPL
descripcion 20K KM SYNTHETIC LF PH2876 Ford Mazda.
cantidad 34.00
precioUnitario 2.4750
descuento 0.00
precioTotalSinImpuesto 84.15
codigo 2
codigoPorcentaje 2
tarifa 12.00
baseImponible 84.15
valor 10.10
结果为get_all_children(tree)
--- DataFrame ---
0
ambiente 2
tipoEmision 1
razonSocial INVERNEG S.A.
ruc 0990658498001
claveAcceso 2201202101099065849800120030120000802950008029516
codDoc 01
estab 003
ptoEmi 012
secuencial 000080295
dirMatriz AV. DE LAS AMERICAS 807 Y CALLE SEGUNDA
fechaEmision 22/01/2021
dirEstablecimiento AV. 10 DE AGOSTO # 132 Y DE LOS CEREZOS
contribuyenteEspecial 136
obligadoContabilidad SI
tipoIdentificacionComprador 04
razonSocialComprador SANTOS ANDINO JOSE RODRIGO
identificacionComprador 1704484185001
direccionComprador AV. MARISCAL SUCRE S8-493 Y JOSE MENDOZA
totalSinImpuestos 84.15
totalDescuento 0
codigo 2
codigoPorcentaje 2
descuentoAdicional 0.00
baseImponible 84.15
tarifa 12.00
valor 10.10
propina 0.00
importeTotal 94.25
moneda DOLAR
formaPago 20
total 94.25
plazo 30
unidadTiempo Dias
codigoPrincipal SH6607-XPL
descripcion 20K KM SYNTHETIC LF PH2876 Ford Mazda.
cantidad 34.00
precioUnitario 2.4750
descuento 0.00
precioTotalSinImpuesto 84.15
campoAdicional ivn
{http://www.w3.org/2000/09/xmldsig#}DigestValue m1xycXw93GXwQi44F/n8Fr4r2TM=
{http://www.w3.org/2000/09/xmldsig#}SignatureValue e7j105IptFmzcpMNYsbkrByTaMnV1XPmnyJ69dXCCfifwo...
{http://www.w3.org/2000/09/xmldsig#}X509Certifi... MIIKFzCCB/+gAwIBAgIEW2EYeTANBgkqhkiG9w0BAQsFAD...
{http://www.w3.org/2000/09/xmldsig#}Modulus yrKN+1xR6KcQvQUjdJza6buyvZ2F+5J06E+BlA/Cvrj/QO...
{http://www.w3.org/2000/09/xmldsig#}Exponent AQAB
{http://uri.etsi.org/01903/v1.3.2#}SigningTime 2021-01-22T17:39:56-05:00
{http://www.w3.org/2000/09/xmldsig#}X509IssuerName CN=AC BANCO CENTRAL DEL ECUADOR,L=QUITO,OU=ENT...
{http://www.w3.org/2000/09/xmldsig#}X509SerialN... 1533089913
{http://uri.etsi.org/01903/v1.3.2#}Description comprobante
{http://uri.etsi.org/01903/v1.3.2#}MimeType text/xml
推荐阅读
- javascript - 谷歌地图在打开标记时将 null 设置为默认值
- c# - 如何访问没有在 C# 中创建对象的类方法?
- python - 'TypeError: list indices must be integers or slices, not dict' in Python 3. Unsure of why this is happening as list values are integers
- scala - In Scala, how would I take a Spark RDD, and output to different files, grouped by the values of a column?
- javascript - Dynamically button and page generation in VueJS
- javascript - 将 api 对象从 fetch 写到 html
- ios - Objective C 到 Swift 的互操作性问题
- google-apps-script - 将 jpg 批量转换为 Google Docs
- node.js - 在线阅读 Redhat OpenShift 内部的秘密?
- kendo-ui - Kendo jQuery Barchart 上堆叠列的 categoryAxis 标签