我的XML看起来像:
...
<termEntry id="c1">
<langSet xml:lang="de">
...
我有代码:
from lxml import etree
...
for term_entry in root.iterfind('.//termEntry'):
print term_entry.attrib['id']
print term_entry.nsmap
for lang_set in term_entry.iterfind('langSet'):
print lang_set.nsmap
print lang_set.attrib
for some_stuff in lang_set.iterfind('some_stuff'):
...
我得到空的nsmap dict,而我的attrib dict看起来像{'{http://www.w3.org/XML/1998/namespace}lang': 'en'}
该文件在命名空间中可能不包含xml:
,或者它可能具有不同的命名空间。我如何知道标签声明中使用的命名空间?实际上,我只需要获得lang
属性,我不关心使用什么命名空间。我不想使用任何像lang_set.attrib.values()[0]
这样糟糕的垃圾或其他具有已知名称的字段的查找。
答案 0 :(得分:5)
我只需要获取
lang
属性,我不关心使用什么命名空间
您的问题不是很清楚,并且您没有提供任何完整的可运行代码示例。但是在评论中按@mmgp的建议做一些字符串操作就足够了。
但是,xml:lang
与random_prefix:lang
(或仅lang
)不同。我认为你应该关心命名空间。如果目标是识别适用于元素内容的自然语言,那么您应该使用xml:lang
(因为这是此属性的明确目的;请参阅http://www.w3.org/TR/REC-xml/#sec-lang-tag)。
我只想知道存储属性<{em}的
{http://www.w3.org/XML/1998/namespace}
字符串的位置。
重要的是要知道xml
前缀是特殊的。它是保留的(与几乎所有其他应该是任意的名称空间前缀相对)并定义为绑定到http://www.w3.org/XML/1998/namespace
。
来自Namespaces in XML 1.0 W3C recommendation:
根据定义,前缀 xml 绑定到命名空间名称
http://www.w3.org/XML/1998/namespace
。它可以但不必声明,并且不得绑定到任何其他命名空间名称。其他前缀不得绑定到此命名空间名称,并且不得将其声明为默认命名空间。
xml
前缀的其他用途是xml:space
和xml:base
属性。
如果lxml没有提供任何名称空间处理方法,那真的很奇怪
lxml处理名称空间就好了,但prefixes are avoided尽可能多。在进行涉及http://www.w3.org/XML/1998/namespace
前缀的查找时,您需要使用xml
命名空间名称。
答案 1 :(得分:4)
你可以简单地使用xpath:
lang_set.xpath('./@xml:lang')[0]
顺便问一下,您使用的是TBX文件吗?