You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:41:30