首页 > 解决方案 > 在 xml etree 解析中使用正则表达式

问题描述

我需要解析 xml 文件并找到一个仅以“123”开头的值。我如何使用下面的代码来做到这一点?可以在这种语法中使用正则表达式吗?

import xml.etree.ElementTree as ET
parse = ET.parse('xml.xml')
print([ events.text for record in parse.findall('.configuration/system/') for events in record.findall('events')])

xml.xml

<rpc-reply>
 <configuration>
        <system>
            <preference>
                <events>123</events>
                <events>124</events>
                <events>1235</events>                    
            </preference>
        </system>
 </configuration>
</rpc-reply>

标签: pythonxmlxpathxml-parsing

解决方案


XPath 谓词可以使用内置函数做很多事情starts-with()。但是您需要使用完全支持 XPath 1.0 的库,例如lxml

from lxml import etree as ET
raw = '''<rpc-reply>
 <configuration>
        <system>
            <preference>
                <events>123</events>
                <events>124</events>
                <events>1235</events>                    
            </preference>
        </system>
 </configuration>
</rpc-reply>'''
root = ET.fromstring(raw)
query = 'configuration/system/preference/events[starts-with(.,"123")]'
print([events.text for events in root.xpath(query)])

如果您仍想使用正则表达式,lxml尽管 XPath 1.0 规范不包括正则表达式,但仍支持正则表达式(请参阅:python 的 lxml 中的正则表达式)。

xml.etree仅支持有限的 XPath 1.0表达式子集,不包括starts-with函数(并且绝对不支持正则表达式)。所以你需要依靠python字符串函数来检查:

....
query = 'configuration/system/preference/events'
print([events.text for events in root.findall(query) if events.text.startswith('123')])

推荐阅读