【问题标题】:Iterate over the next two children of an XML?遍历 XML 的下两个子代?
【发布时间】: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 个连续子节点?

【问题讨论】:

    标签: python xml xml.etree


    【解决方案1】:

    这样

    import xml.etree.ElementTree as ET
    
    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>'''
    
    root = ET.fromstring(xml)
    plans = root.findall(".//plan")
    for plan in plans:
      activities =  plan.findall('./activity')
      legs =  plan.findall('./leg')
    pairs = zip(activities,legs)
    data = []
    for activity,leg in pairs:
      entry = {}
      entry['x'] = activity.attrib['x']
      entry['y'] = activity.attrib['y']
      route = leg.find('route')
      entry['trav_time'] = route.attrib['trav_time']
      data.append(entry)
    
    print(data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多