使用Python将XML子节点导出至CSV的技术求助
解析UBL格式的XML发票文件
处理UBL(Universal Business Language)格式的发票XML确实容易在命名空间上栽跟头,我之前做过类似的批量处理需求,给你分享几个靠谱的解决方案,核心就是搞定命名空间映射,不管你用什么语言,这都是关键步骤。
Python 批量处理示例
Python的xml.etree.ElementTree或者lxml都能轻松搞定,先定义好所有需要的命名空间,再遍历文件提取数据:
import xml.etree.ElementTree as ET import glob # 先把UBL的命名空间都映射好,按需添加cec等其他命名空间 namespaces = { 'ubl': 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2', 'cbc': 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2', 'cac': 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2', 'cec': 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2' # 按需添加 } # 批量遍历所有XML发票文件 for xml_path in glob.glob('./invoices/*.xml'): # 替换成你的文件路径 try: tree = ET.parse(xml_path) root = tree.getroot() # 提取核心字段,比如发票号、开票日期 invoice_id = root.find('.//cbc:ID', namespaces).text issue_date = root.find('.//cbc:IssueDate', namespaces).text # 提取供应商名称 supplier_name = root.find('.//cac:AccountingSupplierParty/cac:Party/cac:PartyName/cbc:Name', namespaces).text print(f"文件: {xml_path.split('/')[-1]} | 发票号: {invoice_id} | 供应商: {supplier_name} | 开票日期: {issue_date}") except Exception as e: print(f"处理文件 {xml_path} 出错: {str(e)}")
常见问题排查
如果你之前的代码跑不通,大概率是这几个原因:
- 命名空间未映射:直接写
root.find('cbc:ID')肯定找不到元素,必须传入namespaces参数 - 元素路径错误:不同UBL版本的元素层级可能有细微差异,建议对照官方的UBL Invoice Schema确认路径
- 文件编码问题:如果XML里有特殊字符,记得用
encoding='UTF-8'参数解析
内容的提问来源于stack exchange,提问作者chrlo
相关产品推荐
相关产品推荐

