2017-04-03 13 views
1

類似の名前のタグに直面したときにxmlリーダーが最初のタグをスキップするように、以下のxmlを選択的に読み取る方法。xmlファイルを選択的に読み取る方法

<paraphrase_candidates source_description="id:9249">  
    <annotation author="87" is_paraphrase="true" source_description="id:18689" > 
     <phenomenon type="lex_same_polarity" projection="local"          source_description="id:5528"> 
      <snippet id="16488" > 
       <scope offset="125" length="4"/> 
      </snippet> 
      <snippet id="16489" > 
       <scope offset="71" length="11"/> 
      </snippet> 
     </phenomenon> 
     <phenomenon type="syn_diathesis" source_description="id:5536"> 
      <snippet id="16488" > 
       <scope offset="32" length="92"/> 
      </snippet> 
       <scope offset="0" length="70"/> 
     </phenomenon> 
    </annotation> 
</paraphrase_candidates> 

具体的には、私は最初の現象タグをスキップして、第2の現象タグのscope属性を取得したいと思います。

My attempts 
for x in root.findall('scope'): 
    print x.attrib[0] 

出力:空

予想される出力:scopeはあなたのXMLにrootの直接の子ではないので{offset="32" length="92"} and {offset="0" length="70}

答えて

1

root.findall('scope')は空に戻りました。代わりに.//scopethe docsを参照)を使用すると、すべてscopeの要素がXMLに含まれます。

root.findall('.//phenomenon[2]//scope') 

テストコード:

>>> raw = '''<paraphrase_candidates source_description="id:9249">        
...  <annotation author="87" is_paraphrase="true" source_description="id:18689" >   
...   <phenomenon type="lex_same_polarity" projection="local"       
       source_description="id:5528">             
...    <snippet id="16488" >               
...     <scope offset="125" length="4"/>           
...    </snippet>                 
...    <snippet id="16489" >               
...     <scope offset="71" length="11"/>           
...    </snippet>                 
...   </phenomenon>                  
...   <phenomenon type="syn_diathesis" source_description="id:5536">     
...    <snippet id="16488" >               
...     <scope offset="32" length="92"/>           
...    </snippet>                 
...     <scope offset="0" length="70"/>           
...   </phenomenon>                  
...  </annotation>                   
... </paraphrase_candidates>'''                
>>> from xml.etree import ElementTree as et             
>>> root = et.fromstring(raw)                 
>>> for x in root.findall('.//phenomenon[2]//scope'): 
...  print x.attrib 
... 
{'length': '92', 'offset': '32'} 
{'length': '70', 'offset': '0'} 
+0

第二phenomenonからのみscopeの要素を取得するには

、あなたは位置インデックスの述語を(0ではない、1からそのXPathの位置インデックスの開始点に注意してください)を使用することができますソリューションのおかげで、それはうまくいった。 – Boby

+0

xmlファイルのhttpが先行している場合、どのように動作させるか。 ' ' – Boby

+1

@Boby、" xpath default namespace "を検索してください。それは名前空間と呼ばれる "http"と呼ばれていません。また、コメントを使用してフォローアップの質問をしないでください。新しい質問を提起してください。ああ、答えがうまくいったら、それを受け入れるべきです(目盛りをクリックしてください)。 –

関連する問題