我需要解析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>
答案 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')])