2013-03-27 78 views
2

我想用ElementTree來解析一個xml文件。考慮到下面的xml,我需要寫入文件'chain_id'(在標題'm'下)和'name'(在標題'r'下),但前提是符合以下條件:1)'css'(標題下的 'i')是不-0,和2) '的BSA'> 0用python解析xml - 根據祖父母的兄弟姐妹選擇孩子

我可以保持 '名稱' 的軌道,當第二條件被滿足:

for r in root.iter('r'): 
     name = r.find('name').text 
     bsa = r.find('bsa').text 
     if eval(bsa) > 0: 
      print name 

但我結束因爲我無法弄清楚如何在第一條標準上做出這個條件。我已經看過Xpath,但是我很難實現它。總之,如果'm'('css')的兄弟姐妹具有一定的價值,我只對'm'的孩子和曾孫有興趣。

xml文件相當大,大於20'i,每個'i'至少有2個'm',每個'm'大於100'r。

我寧願使用標準的Python的方法來做到這一點(不限於lxml或美麗的石頭湯)

<pi> 
    <pe> 
    <ni>20</ni> 
    <i> 
     <id>1</id> 
     <css>-0</css> 
     <m> 
     <id>1</id> 
     <chain_id>B</chain_id> 
     <int_nres>19</int_nres> 
     <rs> 
      <r> 
      <ser_no>1</ser_no> 
      <name>MET</name> 
      <seq_num>0</seq_num> 
      <asa>157.15526405</asa> 
      <bsa>0</bsa> 
      </r> 
      <r> 
      . 
      . 
      .    
      </r> 
     <m> 
     . 
     . 
     . 
     </m> 
    </i> 
    <i> 
     . 
     . 
     . 
    </i> 
    </pe> 
</pi> 

回答

1
myxml=ET.parse('path_to_yourxml') 
for elem in myxml.getroot().findall('pi/pe/i'): 
    if elem.find('css').text!='-0': 
     for elem1 in elem.findall('m'): 
      if eval(elem1.find('rs/r/bsa').text)>0: 
       print elem1.find('rs/r/name').text 
+0

謝謝你的建議。由於某些原因,.findall()不會返回任何內容,但.iter()會返回。我試圖用你的建議,但用.iter()代替.findall()。我會讓你知道它是否有效。 – apo 2013-03-27 19:24:27

+0

爲什麼你想在所有節點上迭代...只是找到 - >該節點1 - >然後findall或找到 - > node2 ..。 !這種方式會更好,更快。 。 – namit 2013-03-27 19:28:15

+0

看到更新後的帖子.. – namit 2013-03-27 19:29:11