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

使用lxml循环合并输出并基于变量提取XML元素的技术需求

使用lxml提取XML元素并循环合并输出

没问题,我来帮你实现用lxml处理这个XML的需求——提取指定元素并循环合并输出,下面是具体的步骤和代码示例:

首先,先明确我们要处理的XML结构(补全了你提供的片段):

<?xml version='1.0' encoding='UTF-8'?>
<ArrayOfSalesOrderHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SalesOrderHeader>
    <TenantCode>15152343</TenantCode>
    <SalesOrderDetails>
      <SalesOrderDetail>
        <ItemCode>20072129</ItemCode>
      </SalesOrderDetail>
      <SalesOrderDetail>
        <ItemCode>67890123</ItemCode>
      </SalesOrderDetail>
    </SalesOrderDetails>
  </SalesOrderHeader>
  <!-- 可以包含更多SalesOrderHeader节点 -->
</ArrayOfSalesOrderHeader>

实现步骤与代码

1. 安装lxml(如果还没安装)

先确保你已经安装了lxml库,没有的话执行:

pip install lxml

2. 核心代码实现

下面的代码会遍历每个SalesOrderHeader,提取对应的TenantCode和所有关联的ItemCode,然后合并输出:

from lxml import etree

# 方式1:从本地XML文件加载
# tree = etree.parse("your_target_xml.xml")
# root = tree.getroot()

# 方式2:从字符串加载(如果XML内容在内存中)
xml_content = """<?xml version='1.0' encoding='UTF-8'?>
<ArrayOfSalesOrderHeader xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SalesOrderHeader>
    <TenantCode>15152343</TenantCode>
    <SalesOrderDetails>
      <SalesOrderDetail>
        <ItemCode>20072129</ItemCode>
      </SalesOrderDetail>
      <SalesOrderDetail>
        <ItemCode>67890123</ItemCode>
      </SalesOrderDetail>
    </SalesOrderDetails>
  </SalesOrderHeader>
</ArrayOfSalesOrderHeader>"""
root = etree.fromstring(xml_content)

# 循环处理每个订单头,提取并合并输出
for order_header in root.findall("SalesOrderHeader"):
    # 获取租户编码,节点不存在时返回None,跳过空值
    tenant_code = order_header.findtext("TenantCode")
    if not tenant_code:
        continue
    
    # 收集当前租户下的所有商品编码
    item_codes = []
    for detail in order_header.findall("SalesOrderDetails/SalesOrderDetail"):
        item_code = detail.findtext("ItemCode")
        if item_code:
            item_codes.append(item_code)
    
    # 合并输出结果
    print(f"租户编码: *{tenant_code}*")
    print(f"关联商品编码: {', '.join(item_codes)}")
    print("-" * 35)  # 分隔线,提升可读性

3. 扩展:保存结果到CSV文件

如果需要把结果持久化到文件,比如CSV,可以修改输出逻辑:

import csv
from lxml import etree

root = etree.parse("your_target_xml.xml").getroot()

with open("order_item_summary.csv", "w", newline="", encoding="utf-8") as csv_file:
    writer = csv.writer(csv_file)
    # 写入表头
    writer.writerow(["租户编码", "商品编码列表"])
    
    for order_header in root.findall("SalesOrderHeader"):
        tenant_code = order_header.findtext("TenantCode")
        if not tenant_code:
            continue
        
        # 用列表推导式简化商品编码收集
        item_codes = [
            detail.findtext("ItemCode") 
            for detail in order_header.findall("SalesOrderDetails/SalesOrderDetail") 
            if detail.findtext("ItemCode")
        ]
        
        writer.writerow([tenant_code, ",".join(item_codes)])

关键说明

  • findall():批量查找指定路径的节点,支持层级路径(比如SalesOrderDetails/SalesOrderDetail)
  • findtext():安全获取节点文本,节点不存在时返回None,避免抛出AttributeError
  • 命名空间处理:如果你的XML中目标节点使用了命名空间(比如xsd:SalesOrderHeader),需要在查找时指定命名空间映射:
    ns_map = {"xsd": "http://www.w3.org/2001/XMLSchema"}
    root.findall("xsd:SalesOrderHeader", namespaces=ns_map)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:39