如何查找具有未在 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.ElementTree
到 parse
和 getroot
来初始化下面 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"]')
我的 xml 看起来像这样
我想定位所有标签 <langSet xml:lang="en">
。如您所见,"xml" 未列在根的 "xmlns" 属性中。我正在使用 xml.etree.ElementTree
到 parse
和 getroot
来初始化下面 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"]')