2013-12-08 42 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