2

ElementTree を使用して xml ファイルを解析しようとしています。以下の xml を考えると、'chain_id' (見出し 'm' の下) と 'name' (見出し 'r' の下) をファイルに書き込む必要がありますが、次の基準が満たされている場合のみ: 1.) 'css' (見出し 'i' の下) は -0 ではなく、2.) 'bsa' > 0

2 番目の基準が満たされると、「名前」を追跡できます。

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>
4

1 に答える 1

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
于 2013-03-27T18:30:42.160 に答える