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

nig*_*ler 5 python xml lxml namespaces

我的XML看起来像:

...
<termEntry id="c1">
    <langSet xml:lang="de">
    ...
Run Code Online (Sandbox Code Playgroud)

我有代码:

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'):
            ...
Run Code Online (Sandbox Code Playgroud)

我得到空的nsmap dict,我的attrib dict看起来像 {'{http://www.w3.org/XML/1998/namespace}lang': 'en'}

该文件可能不包含xml:在命名空间中,或者它可能具有不同的命名空间.我如何知道标签声明中使用的命名空间?实际上,我只需要获取一个lang属性,我不关心使用什么命名空间.我不想使用任何蹩脚的垃圾lang_set.attrib.values()[0]或其他具有已知名称的字段的查找.

alt*_*ard 6

你可以简单地使用xpath:

lang_set.xpath('./@xml:lang')[0]
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你在处理 TBX 文件吗?


mzj*_*zjn 5

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

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

但是,xml:langrandom_prefix:lang(或只是lang)不一样.我认为你应该关心命名空间.如果目标是识别适用于元素内容的自然语言,那么您应该使用xml:lang(因为这是该属性的明确目的;请参阅http://www.w3.org/TR/REC-xml/# sec-lang-tag).


我只是想知道存储{http://www.w3.org/XML/1998/namespace}字符串属性的位置.

重要的是要知道xml前缀是特殊的.它是保留的(与几乎所有其他应该是任意的名称空间前缀相对)并被定义为绑定http://www.w3.org/XML/1998/namespace.

XML 1.0 W3C推荐命名空间:

根据定义,前缀xml绑定到命名空间名称http://www.w3.org/XML/1998/namespace.它可以但不必声明,并且不得绑定到任何其他命名空间名称.其他前缀不得绑定到此命名空间名称,并且不得将其声明为默认命名空间.

xml前缀的其他用途是xml:spacexml:base属性.


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

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