【发布时间】:2020-12-12 23:40:15
【问题描述】:
我想遍历在两种类型的子节点(activity 和 leg)之间交替的 XML:
<person id="100010701">
<plan score="80.11179641489682" selected="yes">
<activity type="home_46200.0" link="10723" x="4632239.860061693" y="5826584.427915721" end_time="03:59:47" >
</activity>
<leg mode="transit_walk" dep_time="03:59:47">
<route type="generic" start_link="10723" end_link="10723" trav_time="00:15:20" distance="747.1733687259284"></route>
</leg>
<activity type="leisure_2400.0" link="10723" x="4631524.841132437" y="5826801.259587159" max_dur="00:00:00" >
</activity>
<leg mode="non_network_walk" dep_time="04:15:07">
<route type="generic" start_link="10723" end_link="10723" trav_time="00:23:01" distance="2763.424921008634"></route>
</leg>
<activity type="car interaction" link="10723" x="4633422.149064934" y="5827759.837646425" max_dur="00:00:00" >
</activity>
...
</plan>
</person>
对于我的计算,我需要来自活动的x 和y 属性,以及来自腿部的trav_time 和distance。
我天真的方法是遍历计划的每个子元素并检查它是什么类型的节点。根据类型,我要么保存一些变量,要么使用保存的变量运行一些代码。
for elem in plan:
x = 0
y = 0
if (elem.tag == "activity"):
x = elem.get("x")
y = elem.get("y")
if (elem.tag == "leg"):
trav_time = elem.find("route").get("trav_time")
distance = elem.find("route").get("distance")
doSomething(trav_time, distance, x, y)
但这似乎很笨拙且不简洁。我真正想要的是像这样循环下一个activity 并关注leg(我知道这不会有充分的理由):
for activity, leg in plan:
x = activity.get("x")
y = activity.get("y")
trav_time = leg.find("route").get("trav_time")
distance = leg.find("route").get("distance")
doSomething(trav_time, distance, x, y)
那么有没有一种简洁的方法来遍历父节点的下 2 个连续子节点?
【问题讨论】: