2014-11-04 90 views
0

,所以我跑在XML輸出第三方程序....這裏是XML部分,我感興趣的是:XML屬性搜索的Python

<something> 
    <process> 
     <iteration number="0" value="186.88" delta="0.5" nu="0.5" rho="0.125" x="0.4375" max_f_grad="45.192" max_greyness_grad="0"/> 
     <iteration number="1" value ="125.89" delta ="0.44955" nu ="0.46812" rho ="0.1217" x="0.39894" max_f_grad="4.5908" max_greyness_grad="0"/> 
     <iteration number="2" value ="90.528" delta ="0.22576" nu ="0.48615" rho ="0.15828" x="0.44465" max_f_grad="2.8968" max_greyness_grad="0"/> 
     <iteration number="3" value ="75.885" delta ="0.22523" nu ="0.49176" rho ="0.19133" x="0.44226" max_f_grad="2.8594" max_greyness_grad="0"/> 
     <iteration number="4" value ="68.869" delta ="0.21915" nu ="0.49569" rho ="0.21463" x="0.43686" max_f_grad="2.8433" max_greyness_grad="0"/> 
     <iteration number="5" value ="64.864" delta ="0.2238" nu ="0.49721" rho ="0.22948" x ="0.43071" max_f_grad="2.8375" max_greyness_grad="0"/> 
........... 
............ 
    </process> 
<something> 

現在,我得到的「迭代次數」的值在我的python腳本變量說it=200,並希望找到相應的增量和價值....我如何做到這一點python我是一個初學者。

回答

1

如果您使用xml.elementtree.Etree,您可以得到任何valuedelta屬性的用下面的代碼值:

values_list = [] 
deltas_list = [] 
for iteration in root.findall(".//process/iteration"): 
    values_list.add(iteration.attrib["value"]) 
    deltas_list.add(iteration.attrib["delta"]) 

如果你真的想要做的事與你價值觀」重新獲得valuedelta屬性,只需將print語句指定爲將這些值分配給將在迭代之外保留的對象的某個東西。

這會重複遍歷根元素<something>中的所有<process>元素,並在其中遍歷每個<process>元素中包含的所有<iteration>元素。

編輯:如果我誤解了你的問題,你想要的是保存一個元素中valuedelta屬性的值,其中屬性number的值是200

values = [] 
deltas = [] 
for two_hundred_iteration in root.findall(".//process/iteration[@number='200']"): 
    values.append(two_hundred_iteration.attrib["value"]) 
    deltas.append(two_hundred_iteration.attrib["delta"]) 

請注意,此語法僅適用於ElementTree 1.3或更高版本,因此如果您的Python爲2.7或更低版​​本,則它不適用於您。

+0

好的,如果我想將'number = 200'的'value'保存在一個變量中......我該怎麼做? – user3145076 2014-11-04 04:00:52

+0

如果你想這樣做,最簡單的方法就是將它保存在一個列表中。我將修改上面的代碼來做到這一點。 – furkle 2014-11-04 04:02:25

+0

'iteration'的參數需要匹配一個屬性名稱;例如「價值觀」應該是「價值」 – jrennie 2014-11-04 04:07:20

-1

我建議你xmltodict

>>> doc = xmltodict.parse(""" 
... <something> 
...  <process> 
...   <iteration number="0" value="186.88" delta="0.5" nu="0.5" rho="0.125" x="0.4375" max_f_grad="45.192" max_greyness_grad="0"/> 
...   <iteration number="1" value ="125.89" delta ="0.44955" nu ="0.46812" rho ="0.1217" x="0.39894" max_f_grad="4.5908" max_greyness_grad="0"/> 
...   <iteration number="2" value ="90.528" delta ="0.22576" nu ="0.48615" rho ="0.15828" x="0.44465" max_f_grad="2.8968" max_greyness_grad="0"/> 
...  </process> 
... <something> 
... """) 
>>> doc["something"]["process"]["iteration"] 
... [OrderedDict([(u'@max_f_grad', u'45.192'), (u'@number', u'0'), (u'@value', u'186.88'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.125'), (u'@delta', u'0.5'), (u'@x', u'0.4375'), (u'@nu', u'0.5')]), OrderedDict([(u'@max_f_grad', u'4.5908'), (u'@number', u'1'), (u'@value', u'125.89'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.1217'), (u'@delta', u'0.44955'), (u'@x', u'0.39894'), (u'@nu', u'0.46812')]), OrderedDict([(u'@max_f_grad', u'2.8968'), (u'@number', u'2'), (u'@value', u'90.528'), (u'@max_greyness_grad', u'0'), (u'@rho', u'0.15828'), (u'@delta', u'0.22576'), (u'@x', u'0.44465'), (u'@nu', u'0.48615')])] 

有了這些數據,你可以更好看。

1

如何打印「價值」與數迭代元素=「200」使用ElementTree的:

for process in root.findall("process"): 
    for iteration in process.findall("iteration"): 
    if int(iteration["number"]) == 200: 
     print iteration["value"] 

當心ElementTree的加載XML到內存中,所以它不是理想的非常大的(〜技嘉+ )文件。

+0

我不確定用戶是否需要過濾任何特定的迭代編號。但我不確定 - 問題很不明確。 – furkle 2014-11-04 04:12:25

+0

@furkle在問題和你的答案的第一個評論之間,我認爲這是一個很好的答案。但是,最好讓OP做出決定/澄清。 – jrennie 2014-11-04 04:14:48

+0

哦,這是一個非常好的答案,可能是OP尋找的答案。我完全看到了「數字= 200」的部分,這絕對改變了我對這個問題的看法。謝謝。 – furkle 2014-11-04 04:17:00