如何读取带属性的XML处理指令并转为字典?
问题描述
我有一份XML文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?> <?foo class="abc" options="bar,baz"?> <document> ... </document>
我需要提取其中名为foo的处理指令及其属性,但使用xml.etree.ElementTree的iterparse读取时,调用.attrib只能得到空字典。我的Python代码如下:
import xml.etree.ElementTree as ET for _, elem in ET.iterparse("data.xml", events=("pi",)): print(repr(elem.tag)) print(repr(elem.text)) print(elem.attrib)
执行结果:
<function ProcessingInstruction at 0x7f848f2f7ba0> 'foo class="abc" options="bar,baz"' {}
请问如何解决这个问题?
解决思路
Python标准库的xml.etree.ElementTree对处理指令(PI)的支持有限,不会自动解析PI的属性到.attrib字典中,需要手动解析elem.text内容提取属性:
拆分指令名与属性部分
先将elem.text按空格拆分,第一个元素是指令名(如foo),剩余部分为属性字符串:pi_text = elem.text parts = pi_text.split(maxsplit=1) pi_name = parts[0] attrib_str = parts[1] if len(parts) > 1 else ""借助临时XML元素解析属性
利用fromstring构造临时元素,让XML解析器自动处理属性字符串,转换为字典:from xml.etree.ElementTree import fromstring attrib = {} if attrib_str: temp_elem = fromstring(f"<temp {attrib_str}/>") attrib = temp_elem.attrib完整可运行代码
整合后的代码如下,仅处理名为foo的处理指令:import xml.etree.ElementTree as ET from xml.etree.ElementTree import fromstring for _, elem in ET.iterparse("data.xml", events=("pi",)): pi_text = elem.text if not pi_text: continue parts = pi_text.split(maxsplit=1) pi_name = parts[0] if pi_name != "foo": continue attrib = {} if len(parts) == 2: temp_elem = fromstring(f"<temp {parts[1]}/>") attrib = temp_elem.attrib print(f"处理指令名称: {pi_name}") print(f"属性字典: {attrib}")执行后会输出:
处理指令名称: foo 属性字典: {'class': 'abc', 'options': 'bar,baz'}注意事项
- 该方法依赖标准XML解析规则,能正确处理带引号的属性值,包括含空格的情况。
- 若处理指令的属性格式不符合XML规范(如未加引号),解析会报错,需额外添加容错逻辑。
内容的提问来源于stack exchange,提问作者Nico Schlömer
相关产品推荐
相关产品推荐

