我不习惯在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,但我不确定它对我需要的是什么?
答案 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 documentation和xpath recommendation