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

如何读取带属性的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:59:56