【问题标题】:can we search multiple pattern using etree findall() in xml?我们可以在 xml 中使用 etree findall() 搜索多个模式吗?
【发布时间】:2021-01-06 15:25:24
【问题描述】:

就我而言,我必须在 XML 文件中找到几个元素并使用 text 属性更新它们的值。为此,我必须搜索 xml 元素 A、B 和 C。我的项目使用 xml.etree 和 python 语言。目前我正在使用:

self.get_root.findall(H/A/T)
self.get_root.findall(H/B/T)
self.get_root.findall(H/C/T)

示例 XML 文件:

<H><A><T>text-i-have-to-update</H></A></T>
<H><B><T>text-i-have-to-update</H></B></T>
<H><C><T>text-i-have-to-update</H></C></T>

我们可以注意到,只有路径中的中间元素不同。有没有办法使用self.get_root.findall(H|(A,B,C)|T) 之类的东西来优化代码?任何正确方向的指导都可以!谢谢!

我遇到了类似的问题:XPath to select multiple tags 但它不适用于我的情况

更新:可能是 findall() 中的正则表达式?

【问题讨论】:

  • 这能回答你的问题吗? XPath to select multiple tags
  • 这对我来说有点不同,我还必须使用 findall() 和上面的一些逻辑,比如正则表达式或其他 @sim
  • 请编辑您的问题并添加实际 xml 的代表性示例。
  • @JackFleeting 刚刚添加。谢谢指出!

标签: python xml findall


【解决方案1】:

您问题中的 html 格式错误;假设它的格式正确(如下所示),试试这个:

import xml.etree.ElementTree as ET

data = """<root>
<H><A><T>text-i-have-to-update</T></A></H>
<H><B><T>text-i-have-to-update</T></B></H>
<H><C><T>text-i-have-to-update</T></C></H>
</root>"""

doc = ET.fromstring(data)
for item in doc.findall('.//H//T'):
    item.text = "modified text"
print(ET.tostring(doc).decode())

输出:

<root>
<H><A><T>modified text</T></A></H>
<H><B><T>modified text</T></B></H>
<H><C><T>modified text</T></C></H>
</root>

【讨论】:

  • 谢谢!我很好奇,就像它将空字符串视为可以是任何值一样,它是否也支持正则表达式? @Jack Fleeting
  • @AadilHoda 人们通常认为在 html/xml 中使用正则表达式是个坏主意。这就是 xpath 表达式的用途。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 2012-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多