如何查找具有未在 xml header 中列出的命名空间属性的所有元素

How to findall element with attribute with namespace which is not listed in the xml header

我的 xml 看起来像这样

我想定位所有标签 <langSet xml:lang="en">。如您所见,"xml" 未列在根的 "xmlns" 属性中。我正在使用 xml.etree.ElementTreeparsegetroot 来初始化下面 root 的值。

所以这个调用工作得很好,但是 returns 所有语言:

root.findall('.//langSet')

这个调用正是我所需要的,但是它 returns 空列表:

root.findall('.//langSet[@{xml}:lang="en"]')

感谢您的帮助。

"xml" 命名空间前缀在 XML 文档和 XPath 中都是预定义的。所以你可以简单地做

.//langSet[@xml:lang='en']

另外,XPath 有一个 lang() 函数允许

.//langSet[lang('en')]

这并没有做完全相同的事情:(a)它还考虑了祖先元素上的 @xml:lang 属性,并且(b)它不仅会匹配 xml:lang="en",还会匹配更具体的语言代码,例如 xml:lang="en-GB".

顺便说一句,"uk" 是乌克兰语的语言代码:我不知道那是否是您的想法。

xml命名空间前缀是预定义的(不需要在XML文档中声明)。但是ElementTree库还是需要显式映射:

nsmap = {"xml": "http://www.w3.org/XML/1998/namespace"}

nsmap 然后可以在 findall() 调用中使用:

root.findall('.//langSet[@xml:lang="en"]', namespaces=nsmap)

您也可以使用以下语法:

root.findall('.//langSet[@{http://www.w3.org/XML/1998/namespace}lang="en"]')