使用lxml查找所有为数字的属性



我使用lxml和python 3.7来解析XML文件。

我想迭代XML中包含数字的所有属性。这个数字可以是实数或整数(例如1,5.2234(

有没有办法使用xpath迭代所有这些属性?或者其他使用lxml的东西?

简称:

<scenario name="ChangeLane_2" type="ChangeLane" town="Town01">
    <ego_vehicle x="107" y="133.5" z="0.5" yaw="0" model="vehicle.lincoln.mkz2017" />
</scenario>

预期分辨率为元素属性:xyzyaw

在lxml中迭代XPath选择的属性(如//@someattribute(的问题是它返回_ElementUnicodeResult;而不是具有名称或父对象等属性的对象。

例如,如果你这样做:

print(tree.xpath("//@*[not(string(number(.))='NaN')]"))

你得到:

['107', '133.5', '0.5', '0']

这些仅仅是数值。

我认为您需要做的是在选择父元素后对属性进行迭代,然后尝试查看它是否可以作为数字(浮点或其他(进行浇注。

示例。。。

from lxml import etree
xml = """<scenario name="ChangeLane_2" type="ChangeLane" town="Town01">
    <ego_vehicle x="107" y="133.5" z="0.5" yaw="0" model="vehicle.lincoln.mkz2017" />
</scenario>"""
tree = etree.fromstring(xml)
for elem in tree.xpath("//*[@*[not(string(number(.))='NaN')]]"):
    attrs = []
    for attr in elem.attrib:
        try:
            float(elem.get(attr))
            attrs.append(attr)
        except ValueError:
            pass
    print(attrs)

打印输出:

['x', 'y', 'z', 'yaw']

最新更新