获取带名称空间的lxml标记属性

时间:2012-12-14 02:45:28

标签: python xml namespaces lxml

我的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]这样糟糕的垃圾或其他具有已知名称的字段的查找。

2 个答案:

答案 0 :(得分:5)

  

我只需要获取lang属性,我不关心使用什么命名空间

您的问题不是很清楚,并且您没有提供任何完整的可运行代码示例。但是在评论中按@mmgp的建议做一些字符串操作就足够了。

但是,xml:langrandom_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:spacexml:base属性。


  

如果lxml没有提供任何名称空间处理方法,那真的很奇怪

lxml处理名称空间就好了,但prefixes are avoided尽可能多。在进行涉及http://www.w3.org/XML/1998/namespace前缀的查找时,您需要使用xml命名空间名称。

答案 1 :(得分:4)

你可以简单地使用xpath:

lang_set.xpath('./@xml:lang')[0]
顺便问一下,您使用的是TBX文件吗?