2016-11-09 58 views
0

我有以下python脚本:如何从具有不同命名空间的孩子获取lxml.objectify项目?

from lxml import objectify 
xml = objectify.fromstring("""<?xml version="1.0" encoding="utf-8"?> 
<cfdi:Comprobante xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cfdi="http://www.sat.gob.mx/cfd/3" xsi:schemaLocation="http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd"> 
    <cfdi:Emisor rfc="XYZU8801017YA" nombre="MOYLOP260"> 
    <cfdi:DomicilioFiscal calle="Calle value"/> 
    <cfdi:RegimenFiscal Regimen="Regimen value" /> 
    </cfdi:Emisor> 
    <cfdi:Complemento> 
    <tfd:TimbreFiscalDigital xsi:schemaLocation="http://www.sat.gob.mx/TimbreFiscalDigital http://www.sat.gob.mx/TimbreFiscalDigital/TimbreFiscalDigital.xsd" xmlns:tfd="http://www.sat.gob.mx/TimbreFiscalDigital" 
     version="1.0" UUID="UUID value"/> 
    </cfdi:Complemento> 
</cfdi:Comprobante>""") 
print "xml.Emisor.DomicilioFiscal.get('calle'):", xml.Emisor.DomicilioFiscal.get('calle') 
print "xml.Emisor.RegimenFiscal.get('Regimen'):", xml.Emisor.RegimenFiscal.get('Regimen') 
tfd = xml.Complemento.xpath('tfd:TimbreFiscalDigital[1]', 
          namespaces={'tfd': 'http://www.sat.gob.mx/TimbreFiscalDigital'}) 
print "tfd[0].get('UUID'):", tfd[0].get('UUID') 
try: 
    print "xml.Complemento.TimbreFiscalDigital: ", xml.Complemento.TimbreFiscalDigital.get('UUID') 
except AttributeError: 
    print "Why I have a AttributeError here?" 

输出是:

xml.Emisor.DomicilioFiscal.get('calle'): Calle value 
xml.Emisor.RegimenFiscal.get('Regimen'): Regimen value 
tfd[0].get('UUID'): UUID value 
xml.Complemento.TimbreFiscalDigital: Why I have a AttributeError here? 

我需要得到的最后一个节点的值UUID,但我不喜欢使用硬编码XML命名空间来自xpath,因为这是从xml字符串定义的。

你能帮我吗?谢谢!

我是否需要更新儿童的名称空间?

回答

0

http://lxml.de/objectify.html#namespace-handling,您需要提供孩子的命名空间做查找时:

tfd = xml.Complemento["{http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital"] 

或者:

tfd = getattr(xml.Complemento, "{http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital") 

的唯一方法(即我能想到的),以获得一个没有指定子名称空间的特定子元素将使用local-name()

tfd = xml.Complemento.xpath("*[local-name() = 'TimbreFiscalDigital']")[0] 
print tfd.get("UUID") 
相关问题