Skip to main content
 首页 » 编程设计

python之XML:回溯父元素

2025年05月04日7wayfarer

我正在寻找与 Python 中的 XML 相关的问题的解决方案。尽管 spectrum 不是根元素,但让我们假设它是针对此示例的。

<spectrum index="2" id="controller=0 scan=3" defaultArrayLength="485"> 
          <cvParam cvRef="MS" accession="MS:1000511" name="ms level" value="2"/> 
          <cvParam cvRef="MS" accession="MS:1000580" name="MSn spectrum" value=""/> 
          <cvParam cvRef="MS" accession="MS:1000127" name="centroid mass spectrum" value=""/> 
          <precursorList count="1"> 
            <precursor spectrumRef="controller=0 scan=2"> 
              <isolationWindow> 
                <cvParam cvRef="MS" accession="MS:1000040" name="m/z" value="810.78999999999996"/> 
                <cvParam cvRef="MS" accession="MS:1000023" name="isolation width" value="2"/> 
              </isolationWindow> 
              <selectedIonList count="1"> 
                <selectedIon> 
                  <cvParam cvRef="MS" accession="MS:1000040" name="m/z" value="810.78999999999996"/> 
                </selectedIon> 
              </selectedIonList> 
              <activation> 
                <cvParam cvRef="MS" accession="MS:1000133" name="collision-induced dissociation" value=""/> 
                <cvParam cvRef="MS" accession="MS:1000045" name="collision energy" value="35"/> 
              </activation> 
            </precursor> 
          </precursorList> 
          <binaryDataArrayList count="2"> 
            <binaryDataArray encodedLength="5176"> 
              <cvParam cvRef="MS" accession="MS:1000523" name="64-bit float" value=""/> 
              <cvParam cvRef="MS" accession="MS:1000576" name="no compression" value=""/> 
              <cvParam cvRef="MS" accession="MS:1000514" name="m/z array" value="" unitCvRef="MS" unitAccession="MS:1000040" unitName="m/z"/> 
              <binary>AAAAYHHsbEAAAADg3yptQAAAAECt7G1AAAAAAN8JbkAAAAAA.......hLJ==</binary> 
            </binaryDataArray> 
            <binaryDataArray encodedLength="2588"> 
              <cvParam cvRef="MS" accession="MS:1000521" name="32-bit float" value=""/> 
              <cvParam cvRef="MS" accession="MS:1000576" name="no compression" value=""/> 
              <cvParam cvRef="MS" accession="MS:1000515" name="intensity array" value=""/> 
              <binary>ZFzUQWmVo0FH/o9BRfUyQg+xjUOzkZdC5k66QWk6HUSpqyZCsV1NQ......uH=</binary> 
            </binaryDataArray> 
          </binaryDataArrayList> 
</spectrum> 

我想要实现的是在树中找到所有 selectedIon 元素并回溯它的父元素谱。如果找到 selectedIon 元素,则

SelectedIon information:


Mass: 810.78999999999996

Spectra Info: 
------------- 
index=2 
id=controller=0 
scan=3 
length=485 
 
General Info 
------------ 
ms level=2 
Msn spectrum= - 
centriod mass spectrum=- 
..................... 
And all the cvParam name and value as above.  
 
Binary 
------ 
m/z array = AAAAYHHsbEAAAADg3yptQAAAAECt7G1AAAA.....==  
 
intensity array = ZFzUQWmVo0FH/o9BRfUyQg+xjUOzkZdC5k66Q....5C77= 

到目前为止我尝试了什么:

import xml.etree.ElementTree as ET 
tree=ET.parse('file.mzml') 
NS="{http://psi.hupo.org/ms/mzml}" 
filesource=tree.findall('.//'+NS+'selectedIon') # Will get all selectedIon element from the tree 

现在如何回溯到频谱元素/子元素以解析出上述相关信息?

我怎样才能成功?

请您参考如下方法:

XPath 将允许您访问祖先:“ancestor::spectrum”将返回 <spectrum>你所在的元素。如果使用 lxml,则可以使用完整的 XPath 语法来查找所需的元素。

from lxml import etree 
tree = etree.XML('file.mzml') 
NS = "{http://psi.hupo.org/ms/mzml}" 
filesource = tree.findall('.//'+NS+'selectedIon') 
spectrum = filesource.xpath('ancestor::spectrum')[0] 

(我觉得,没测试过。。。)

更新:实际有效的代码:

from lxml import etree 
 
tree = etree.parse('foo.xml') 
for el in tree.findall(".//selectedIon"): 
    for top in el.xpath("ancestor::spectrum"): 
        print top