【发布时间】:2015-09-12 20:07:47
【问题描述】:
我正在解析每天从供应商处收到的 XML 文档,它大量使用命名空间。我在这里将问题最小化为最小子集:
我需要解析一些元素,它们都是具有特定属性的元素的子元素。
我可以使用lxml.etree.Element.findall(TAG, root.nsmap) 来查找我需要检查其属性的候选节点。
然后,我尝试通过我知道它使用的名称检查每个Elements 的属性:这里具体是ss:Name。如果该属性的值是所需的值,我将深入研究Element(继续做其他事情)。
我该怎么做?
我解析的XML大致是
<FOO xmlns="SOME_REALLY_LONG_STRING"
some gorp declaring a bunch of namespaces one of which is
xmlns:ss="THE_VERY_SAME_REALLY_LONG_STRING_AS_ROOT"
>
<child_of_foo>
....
</child_of_foo>
...
<SomethingIWant ss:Name="bar" OTHER_ATTRIBS_I_DONT_CARE_ABOUT>
....
<MoreThingsToLookAtLater>
....
</MoreThingsToLookAtLater>
....
</SomethingIWant>
...
</FOO>
我找到了我想要的第一个元素 SomethingIWant 就像这样(最终我想要它们,所以我确实找到了所有)
import lxml
from lxml import etree
tree = etree.parse(myfilename)
root = tree.getroot()
# i want just the first one for now
my_sheet = root.findall('ss:RecordSet', root.nsmap)[0]
现在我想从这个元素中获取ss:Name 属性来检查它,但我不确定如何?
我知道my_sheet.attrib 会显示原始 URI,后跟属性名称,但我不希望这样。我需要检查它是否具有特定命名空间属性的特定值。 (因为如果它是错误的,我可以完全跳过这个元素的进一步处理)。
我尝试使用lxml.etree.ElementTree.attrib.get(),但似乎没有得到任何有用的东西。
有什么想法吗?
【问题讨论】:
-
您实际上是在使用
lxml库还是仅使用标准python 中的xml 解析器?etree到底是什么,lxml.etree? -
根据@har07 回答再次更新
-
所以你想从之前选择的元素中获取命名空间中的属性,比如你的代码 sn-p 中的
my_sheet。在这种情况下,我的更新与您更新的问题相关。 -
如果您愿意,您甚至可以在一个 xpath 表达式中选择具有某个属性等于某个值的所有元素。类似于:
root.xpath('//ss:RecordSet[@ss:Name="bar"]')
标签: python xml xml-parsing lxml