如何从墨西哥SAT的CFDI XML文件中获取属性值
解决带命名空间的XML标签读取与UUID属性获取问题
你的代码无法找到tfd:TimbreFiscalDigital标签,核心原因有两个:
- 没有为lxml提供命名空间映射,它不知道
tfd:、cfdi:这些前缀对应的实际XML命名空间URI; - 标签路径不完整,
TimbreFiscalDigital是嵌套在cfdi:Complemento下的,直接查找根节点下的tfd:TimbreFiscalDigital自然找不到。
修正后的代码示例
from lxml import etree # 定义XML中用到的命名空间映射 namespaces = { 'cfdi': 'http://www.sat.gob.mx/cfd/4', 'tfd': 'http://www.sat.gob.mx/TimbreFiscalDigital' } xDoc = etree.parse(xmlFile) # 使用完整路径+命名空间查找目标元素 folioFiscal = xDoc.find('cfdi:Complemento/tfd:TimbreFiscalDigital', namespaces=namespaces) if folioFiscal is not None: # 获取UUID属性值 uuid_value = folioFiscal.get('UUID') print(uuid_value) else: print("未找到TimbreFiscalDigital标签")
补充说明
- 命名空间字典必须和XML中
xmlns:cfdi、xmlns:tfd定义的URI完全一致; - 如果需要批量查找或者更复杂的路径,可以用
xpath方法简化操作:
这种方式会直接返回UUID属性值的列表,取第一个元素即可(假设XML中只有一个该标签)。uuid_value = xDoc.xpath('//tfd:TimbreFiscalDigital/@UUID', namespaces=namespaces)[0]
内容的提问来源于stack exchange,提问作者Rafa Barragan
相关产品推荐
相关产品推荐

