从 lxml 中的属性获取本地名称
Get localname from attribute in lxml
问题:
我可以使用 lxml.etree.QName(element).localname
获得 element.tag
没有名称空间的名称。
如何与 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>
此脚本 returns 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'}]
您也可以对属性使用 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
感谢@mzjn 的回答,我可以编写一个函数,像 e.attrib
那样将属性输出为 dict。
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'}]
问题:
我可以使用 lxml.etree.QName(element).localname
获得 element.tag
没有名称空间的名称。
如何与 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>
此脚本 returns 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'}]
您也可以对属性使用 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
感谢@mzjn 的回答,我可以编写一个函数,像 e.attrib
那样将属性输出为 dict。
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'}]