在XML etree解析中使用正则表达式

时间:2019-11-07 07:59:46

标签: python xml xpath xml-parsing

我需要解析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>

1 个答案:

答案 0 :(得分:1)

使用内置函数starts-with(),XPath谓词可以完成很多工作。但是您需要使用完全支持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)])

如果您仍想使用正则表达式,尽管XPath 1.0规范不包含正则表达式,lxml也支持正则表达式(请参阅:Regex in lxml for python)。

xml.etree仅支持limited subset of 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')])