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

如何用Python的xml.etree.ElementTree解析部分XML标签并保留其他为字符串?

使用xml.etree.ElementTree实现XML部分解析需求

需求说明

给定如下XML内容:

<items>
    <item id="0001" type="donut">
        <name>Cake</name>
        <batters>
            <batter id="1001">Regular</batter>
            <batter id="1002">Chocolate</batter>
            <batter id="1003">Blueberry</batter>
        </batters>
        <topping id="5001">None</topping>
    </item>
    <item id="0002" type="biscuit">
        <name>Biscuit</name>
        <batters>
            <batter id="1001">Regular</batter>
            <batter id="1002">Chocolate</batter>
            <batter id="1004">Orange</batter>
            <batter id="1005">Banana</batter>
        </batters>
        <topping id="5006">Sprinkles</topping>
    </item>
</items>

需要提取每个item的id,并将对应batters节点内的所有内容保留为XML格式字符串,最终得到如下结构的字典:

{
    '0001': '<batter id="1001">Regular</batter>\n        <batter id="1002">Chocolate</batter>\n        <batter id="1003">Blueberry</batter>',
    '0002': '<batter id="1001">Regular</batter>\n        <batter id="1002">Chocolate</batter>\n        <batter id="1004">Orange</batter>\n        <batter id="1005">Banana</batter>'
}

由于batters内部结构可能复杂且变化,无需解析其内部标签,仅保留原始XML字符串即可。

实现方案

可以通过xml.etree.ElementTree实现该需求,核心思路是解析XML树后,对batters的子节点进行序列化拼接,步骤如下:

  1. 解析XML文件或字符串,构建ElementTree对象;
  2. 遍历所有item节点,提取每个节点的id属性;
  3. 找到每个item下的batters节点,遍历其所有子元素,将每个子元素序列化为XML字符串;
  4. 将序列化后的子元素字符串按格式拼接,与item的id关联存入字典。

代码示例

import xml.etree.ElementTree as ET
import pprint

# 示例XML内容,实际使用时可替换为ET.parse('your_file.xml').getroot()
xml_content = '''
<items>
    <item id="0001" type="donut">
        <name>Cake</name>
        <batters>
            <batter id="1001">Regular</batter>
            <batter id="1002">Chocolate</batter>
            <batter id="1003">Blueberry</batter>
        </batters>
        <topping id="5001">None</topping>
    </item>
    <item id="0002" type="biscuit">
        <name>Biscuit</name>
        <batters>
            <batter id="1001">Regular</batter>
            <batter id="1002">Chocolate</batter>
            <batter id="1004">Orange</batter>
            <batter id="1005">Banana</batter>
        </batters>
        <topping id="5006">Sprinkles</topping>
    </item>
</items>
'''

# 解析XML字符串
root = ET.fromstring(xml_content)
result = {}

# 遍历每个item节点
for item in root.findall('item'):
    item_id = item.get('id')
    batters_node = item.find('batters')
    if batters_node:
        batter_xml_list = []
        # 遍历batters下的所有子元素(支持嵌套结构)
        for child in batters_node.iter():
            # 跳过batters自身节点,只处理子元素
            if child == batters_node:
                continue
            # 序列化子元素为XML字符串
            xml_str = ET.tostring(child, encoding='utf-8', xml_declaration=False).decode('utf-8')
            # 添加缩进匹配示例格式
            batter_xml_list.append(f'        {xml_str}')
        # 拼接所有子元素的XML字符串
        result[item_id] = '\n'.join(batter_xml_list)

# 打印结果
pprint.pprint(result)

代码说明

  • ET.fromstring()用于解析XML字符串,读取本地文件可替换为ET.parse('file_path').getroot();
  • item.get('id')直接提取item节点的id属性;
  • batters_node.iter()遍历batters下的所有层级子元素,兼容复杂嵌套结构;
  • ET.tostring()将Element对象转为XML字符串,通过参数控制编码和是否保留XML声明;
  • 手动添加缩进以匹配需求中的格式,若不需要严格格式可省略缩进拼接步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:02:18