7

我的 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 字典,我的属性字典看起来像{'{http://www.w3.org/XML/1998/namespace}lang': 'en'}

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

4

2 回答 2

6

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

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

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


我只想知道{http://www.w3.org/XML/1998/namespace}属性的字符串存储在哪里。

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

来自XML 1.0 W3C 推荐中的命名空间

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

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


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

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

于 2012-12-15T14:07:46.953 回答
6

你可以简单地使用xpath:

lang_set.xpath('./@xml:lang')[0]

顺便问一下,您在处理 TBX 文件吗?

于 2016-12-28T01:25:48.283 回答