如何使用lxml将名称空间URI转换为前缀?

时间:2019-05-04 19:17:00

标签: python xml lxml xml-namespaces

lxml存储所有具有完整名称空间URI的合格名称,例如

from lxml import etree

root = etree.fromstring('''
<a:doc xmlns:a="http://somesite.org/markup" xmlns:b="http://anothersite.org/markup" a:attr="foo">
  <b:e b:attr="bar"/>
</a:doc>''')

for el in root.iter():
    print("Element", el.tag)
    for a in el.attrib:
        print("  Attribute", a)

将打印

Element {http://somesite.org/markup}doc
  Attribute {http://somesite.org/markup}attr
Element {http://anothersite.org/markup}e
  Attribute {http://anothersite.org/markup}attr

但是,如果我需要更多具有名称空间前缀而不是URI的人类可读输出,该怎么办?喜欢

Element a:doc
  Attribute a:attr
Element b:e
  Attribute b:attr

当然,我可以自己编写转换函数,例如

def uri2prefix(name, nsmap):
    qname = etree.QName(name)
    for pref, uri in nsmap.items():
        if qname.namespace == uri:
            return pref + ':' + qname.localname
    return name

for el in root.iter():
    print("Element", uri2prefix(el.tag, el.nsmap))
    for a in el.attrib:
        print("  Attribute", uri2prefix(a, el.nsmap))

但是lxml中必须有相同的功能,因为lxml.etree.tostring()使用了它。不幸的是,我在文档中找不到它。也许有人知道魔术功能可以完成这项工作?

1 个答案:

答案 0 :(得分:0)

没有比使用您的 uri2prefix 函数更好的解决方案了。

唯一可以改进的元素是:this.searchService.getPlayers(this.searchTerm).subscribe((data: any) => { <process your data here> }); 实例具有 prefix 属性。因此,您可以像这样更改循环:

_Element