【问题标题】:Get localname from attribute in lxml从 lxml 中的属性获取本地名称
【发布时间】:2019-02-07 15:34:40
【问题描述】:

问题:

我可以使用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>

此脚本返回 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'}]

【问题讨论】:

    标签: python lxml xml-namespaces


    【解决方案1】:

    您也可以将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
    

    【讨论】:

      【解决方案2】:

      感谢@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'}]
      

      【讨论】:

        猜你喜欢
        • 2018-11-16
        • 2012-01-08
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多