Skip to main content
 首页 » 编程设计

python之用 python 解析 xml之根据祖 parent 的 sibling 选择 child

2025年05月04日9lyhabc

我正在尝试使用 ElementTree 来解析 xml 文件。鉴于下面的 xml,我需要写入文件“chain_id”(在标题“m”下)和“名称”(在标题“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”)的 sibling 具有一定的值(value),我只对“m”的 child 和曾孙感兴趣。

xml 文件相当大,有 > 20 个“i”,每个“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> 

请您参考如下方法:

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