我正在解析每天从供应商那里收到的 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()
但我似乎没有得到任何有用的东西。
有任何想法吗?