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

如何解析包含多个<object>元素的XML文件并提取指定字段?

多Object节点的XML批量解析方案

问题背景

XML结构中<objects>节点下包含多个<object>子节点,每个<object>内部嵌套<record>节点,存储net_amount、order_number等业务字段。使用Python的xml.etree.ElementTree库解析时,多<object>场景下无法正常提取目标字段,仅单个<object>时能运行,需要修改代码实现大量XML文件的批量处理。

XML示例

<objects>
   <object>
      <record>
            <net_amount>3657.82</net_amount>
            <order_number>47004603</order_number>
            <invoice_source>Email</invoice_source>
            <invoice_capture_date>2022-11-13</invoice_capture_date>
            <document_type>INVOICE</document_type>
            <data_capture_provider_code>00001</data_capture_provider_code>
            <data_capture_provider_reference>594826</data_capture_provider_reference>
            <document_capture_provide_code>00002</document_capture_provide_code>
            <document_capture_provider_ref>594826</document_capture_provider_ref>
      </record>
   </object>
   <object>
      <record>
            <net_amount>1234.56</net_amount>
            <order_number>47004604</order_number>
            <invoice_source>Portal</invoice_source>
            <invoice_capture_date>2022-11-14</invoice_capture_date>
            <document_type>INVOICE</document_type>
            <data_capture_provider_code>00001</data_capture_provider_code>
            <data_capture_provider_reference>594827</data_capture_provider_reference>
            <document_capture_provide_code>00002</document_capture_provide_code>
            <document_capture_provider_ref>594827</document_capture_provider_ref>
      </record>
   </object>
</objects>

原代码问题

原代码直接在根节点(<objects>)下查找<record>节点,但<record>实际嵌套在<object>内部,导致多<object>场景下无法匹配到任何节点,提取失败。

原代码:

for file in files:
    tree = ET.parse(file)
    root = tree.getroot()
    for i in root.findall("record"):
        net_amount = i.find("net_amount").text
        order_number = i.find("order_number").text

修改后的解决方案

方案1:逐层遍历节点

通过先遍历所有<object>节点,再在每个<object>下查找<record>,确保定位到正确的节点层级:

import xml.etree.ElementTree as ET
import os

# 替换为你的XML文件目录路径
xml_dir = "./xml_files"
files = [os.path.join(xml_dir, f) for f in os.listdir(xml_dir) if f.endswith(".xml")]

for file in files:
    try:
        tree = ET.parse(file)
        root = tree.getroot()
        # 遍历所有object节点
        for obj in root.findall("object"):
            record = obj.find("record")
            if record:
                # 使用findtext避免节点不存在时抛出异常
                net_amount = record.findtext("net_amount")
                order_number = record.findtext("order_number")
                # 这里可以添加数据存储逻辑,比如写入CSV
                print(f"[{os.path.basename(file)}] 订单号: {order_number}, 净额: {net_amount}")
    except Exception as e:
        print(f"处理文件 {file} 失败: {str(e)}")

方案2:使用XPath直接定位

利用XPath表达式直接匹配所有<object>下的<record>节点,代码更简洁:

import xml.etree.ElementTree as ET
import os

xml_dir = "./xml_files"
files = [os.path.join(xml_dir, f) for f in os.listdir(xml_dir) if f.endswith(".xml")]

for file in files:
    try:
        tree = ET.parse(file)
        root = tree.getroot()
        # 通过XPath直接获取所有嵌套的record节点
        for record in root.findall(".//object/record"):
            net_amount = record.findtext("net_amount")
            order_number = record.findtext("order_number")
            print(f"[{os.path.basename(file)}] 订单号: {order_number}, 净额: {net_amount}")
    except Exception as e:
        print(f"处理文件 {file} 失败: {str(e)}")

关键优化点

  • 修正节点层级定位:明确<record>属于<object>的子节点,而非根节点直接子元素
  • 异常安全:使用findtext替代find().text,避免节点不存在时抛出AttributeError
  • 批量处理容错:添加异常捕获,单个文件解析失败时不中断整个批量任务

内容的提问来源于stack exchange,提问作者Flint_Lockwood

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:31:07