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]或其他具有已知名称的字段的查找.
你可以简单地使用xpath:
lang_set.xpath('./@xml:lang')[0]
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你在处理 TBX 文件吗?
我只需要获取一个
lang属性,我不关心使用什么命名空间
您的问题不是很清楚,并且您没有提供任何完整的可运行代码示例.但是在评论中按@mmgp的建议做一些字符串操作就足够了.
但是,xml:lang与random_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绑定到命名空间名称
http://www.w3.org/XML/1998/namespace.它可以但不必声明,并且不得绑定到任何其他命名空间名称.其他前缀不得绑定到此命名空间名称,并且不得将其声明为默认命名空间.
xml前缀的其他用途是xml:space和xml:base属性.
如果lxml没有为命名空间处理提供任何方法,那真的很奇怪
lxml处理名称空间就好了,但尽可能避免使用前缀.http://www.w3.org/XML/1998/namespace在执行涉及xml前缀的查找时,您将需要使用命名空间名称.
| 归档时间: |
|
| 查看次数: |
4842 次 |
| 最近记录: |