Python,基于子属性的父项列表

时间:2013-12-08 12:01:46

标签: python xml

我不习惯在Python中解析xml而且我对以下内容有点困惑。

我有一个XML文件,其中有许多位置表示为节点元素中的lat,lon值。

位置类型位于具有“k”和“v”属性的“tag”元素中。

<root>
    <node id="12345678" lat="50.5" lon="3.0" otherdata="not needed">
        <tag k="this_key" v="value_a"/>
        <tag k="that_key" v="value_b"/>
    </node>
    <node ...>
        <tag .../>
    </node>
</root>

我需要过滤特定的“v”值,然后使用它来生成一个lat,lon值列表,使用父节点id作为唯一id。

我可以使用以下

获取第一个节点
fence = soup.find(v="FenceLine")
prevnode = fence.find_parents("node")
print prevnode

如何仅包含包含特定属性的子项的父母集合?

我一直在尝试使用BeautifulSoup,但我不确定它对我需要的是什么?

1 个答案:

答案 0 :(得分:0)

如果我得到你想要的东西,你可以通过使用标准的“xml”库来实现你的目的:

import xml.etree.ElementTree as ET

def get_dict(value):
    root = ET.parse('a.xml')

    tmp={}

    for node in root.iterfind(".//tag[@v='{0}']/..".format(value)):
        tmp[node.get('id')] = (node.get('lat'),node.get('lon'))

    return tmp

有趣的部分是:

root.iterfind(".//tag[@v='{0}']/..".format(value))

返回一个迭代器,它产生所有“tag”的父标记,其“v”属性与“value”匹配。 如果您希望获得列表而不是迭代器,则可以使用“findall”方法而不是“iterfind”。

有关“xml”库的详细信息以及“查找”的棘手语法,您可以阅读official xml documentationxpath recommendation