python - 在 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>
解决方案
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')])
推荐阅读
- php - 使用href在php中发送邮件
- amazon-web-services - Terraform - 无法访问 Web 服务器 - 实例停止服务
- python - 在 Python 中使用约束验证 Regex US ZIP CODE
- javascript - 我正在从 Spotify API 获取数据,但运行一段时间后它会标记错误并开始一遍又一遍地记录相同的信息
- video - 将 ffmpeg filter_complex 中具有不同时基的视频转换为使用 xfade
- sql - 数据未显示在表格中,仅显示列名
- swiftui - 如何避免在状态变量更新上呈现非相关视图
- python - 网页抓取大量链接?
- java - 带有 CustomAdapter 的片段中的多个 OnClickListener
- c++ - 指向地图内对象的指针无效,但该对象仍然存在(可执行代码示例)