2013-12-08 44 views
1

我不习惯在Python中解析xml,而且我有点卡在下面。Python,基于孩子属性的父母名单

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

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

<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”值,然后用它来生成使用父节点ID作为唯一id纬度,经度值的列表。

我可以得到以下

fence = soup.find(v="FenceLine") 
prevnode = fence.find_parents("node") 
print prevnode 

的第一个节点如何回报父母的集合只含有一个特定属性的孩子吗?

我一直在尝试使用BeautifulSoup搜索后,但我不知道它是最好的我需要什么?

+0

BeautifulSoup应该罚款棘手的语法的详细信息,但如果你想在XML输入验证的架构,它可能最好使用验证XML解析器,而不是使用'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)) 

它返回得到家长的迭代器具有与“值”匹配的“v”属性的所有“标签”的标签。 如果你喜欢得到一个列表而不是迭代器,你可以使用“findall”方法而不是“iterfind”。

有关“XML”库和“发现”你可以阅读official xml documentationxpath recommendation