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

2024-10-02 18:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我的xml看起来像这样 source xml

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

因此,此调用工作正常,但返回所有语言:

root.findall('.//langSet')

我需要这个调用,但它返回空列表:

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

谢谢你的帮助


Tags: 目标lang属性parseroot标签xmlen
2条回答

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"]')

“xml”名称空间前缀在xml文档和XPath中都是预定义的。所以你可以简单的做

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

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

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

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

顺便说一句,“uk”是乌克兰语的语言代码:我不知道你是不是这么想的

相关问题 更多 >