使用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
相关产品推荐
相关产品推荐

