2013-03-27 80 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