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

如何用Python lxml遍历CSV列表生成多标签XML?

使用Python lxml模块将CSV转换为指定XML结构

原始CSV文件内容:

customer, restaurant, drink, dish 
1, MC, "C1, C6", "D1, D2, D3"

期望生成的XML结构:

<Example>
<Customer> 1 </Customer>
<Restaurant> MC </Restaurant>
<Drink>
   <Drink> C1 </Drink>
   <Drink> C6 </Drink>
</Drink>
<Dish> D1 </Dish>
<Dish> D2 </Dish>
<Dish> D3 </Dish>
</Example>

你的核心问题是没处理CSV中drink、dish字段的多值拆分,也没实现嵌套/多重复标签的生成逻辑。以下是修正后的完整代码:

import csv
from lxml.builder import E
import lxml.etree

with open('restaurant.csv') as csvfile:
    example_children = []
    for row in csv.DictReader(csv):
        # 添加Customer和Restaurant元素,同时清洗空格
        example_children.append(E.Customer(row['customer'].strip()))
        example_children.append(E.Restaurant(row['restaurant'].strip()))
        
        # 处理嵌套Drink结构:外层Drink包裹多个子Drink标签
        drink_items = [d.strip() for d in row['drink'].split(',')]
        drink_element = E.Drink(*[E.Drink(item) for item in drink_items])
        example_children.append(drink_element)
        
        # 处理多同级Dish标签
        dish_items = [d.strip() for d in row['dish'].split(',')]
        example_children.extend([E.Dish(item) for item in dish_items])
    
    # 构建根元素Example
    result = E.Example(*example_children)

# 生成格式化的XML并写入文件
tree = lxml.etree.tostring(result, pretty_print=True, encoding='utf-8')
with open('output.xml', 'wb') as f:
    f.write(tree)

关键逻辑说明

  • 字段清洗与拆分:用split(',')拆分多值字段,strip()去除值前后的空格,避免生成带冗余空格的标签内容。
  • 嵌套Drink标签:先创建外层E.Drink元素,再将拆分后的每个饮品作为子E.Drink传入,用*解包列表作为参数实现嵌套。
  • 多同级Dish标签:直接生成多个独立的E.Dish元素,用extend()批量添加到根元素的子元素列表中。
  • 语法修正:修复了原代码中E.Restaurant([row'restaurant'])的语法错误,以及变量名results的拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:31:39