我使用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>
预期分辨率为元素属性:x,y、z和yaw
在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']