Получить локальное имя из атрибута в lxml - PullRequest
0 голосов
/ 07 февраля 2019

Вопрос:

Я могу получить element.tag имя без пространства имен, используя lxml.etree.QName(element).localname.
Как сделать аналог с element.attrib?


Пример:

Предполагается, что этот XML-файл:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<root xmlns="some_ns" xmlns:soc="some_other_ns" >
    <someTag attr1="something" soc:attr2="something else"></someTag>
</root>

Этот скрипт возвращает attrib с пространством имен для второго атрибута:

from lxml import etree
root = etree.parse('test.xml').getroot()
ns = { 'n':'some_ns', 'son':'some_other_ns' }
print ([e.attrib for e in root.xpath('./n:someTag', namespaces = ns)])

Выход:

[{'{some_other_ns}attr2': 'something else', 'attr1': 'something'}]

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Благодаря ответу @ mzjn я мог бы написать функцию, которая выводит атрибуты как dict, как e.attrib.

from lxml import etree
root = etree.parse('test.xml').getroot()
ns = { 'n':'some_ns', 'son':'some_other_ns' }

def attrib_localnames(a):
    out={}
    for n,v in a.attrib.items():
        out[etree.QName(n).localname]=v
    return out

print ([attrib_localnames(e) for e in root.xpath('./n:someTag', namespaces = ns)])

Вывод:

[{'attr1': 'something', 'attr2': 'something else'}]
0 голосов
/ 07 февраля 2019

Вы также можете использовать QName для атрибутов.

tag = root.xpath('./n:someTag', namespaces = ns)[0]
for a, v in tag.attrib.items():
    print(etree.QName(a).localname, v)

Вывод:

attr1 something
attr2 something else
...