使用python解析xml - 根据祖父母的兄弟姐妹选择子项

时间:2013-03-27 18:12:47

标签: python xml elementtree

我正在尝试使用ElementTree来解析xml文件。鉴于下面的xml,我需要写入'chain_id'(标题'm'下)和'name'(标题'r'下),但只有符合以下条件:1。''css'(在标题'i'下面不是-0,和2.)'bsa'> 0

我可以在满足第二个标准时跟踪'名称':

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'至少有两个'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 个答案:

答案 0 :(得分: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