如何用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的子节点进行序列化拼接,步骤如下:
- 解析XML文件或字符串,构建ElementTree对象;
- 遍历所有
item节点,提取每个节点的id属性; - 找到每个
item下的batters节点,遍历其所有子元素,将每个子元素序列化为XML字符串; - 将序列化后的子元素字符串按格式拼接,与
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
相关产品推荐
相关产品推荐

