有没有办法获取xml元素?

2024-09-30 06:23:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在解析以下XML以获取一些值并将它们存储在文件中,我能够获取属性,但是当我尝试提取所需的值时,我得到了none当使用x.get()时,就像在示例中一样,您能帮我理解发生了什么吗?我怎样才能得到我需要的值

这是xml的一个示例:

<?xml version='1.0' encoding='UTF-8'?>
<sbml xmlns:fbc="http://www.sbml.org/sbml/level3/version1/fbc/version2" level=3 sboTerm="SBO:0000624" version="1" xmlns=""http://www.sbml.org/sbml/level3/version1/core" fbc:required="false">
   <model id="iJR904" fbc:strict="true">
      <listOfUnitDefinitions> fobo </listOfUnitDefinitions>
      <fbc:listOfObjectives fbc:activeObjective="obj> Objectives </fbc:listOfObjectives>
      <listOfParameters>
         <parameter constant="true" id="cobra_default_lb" sboTerm="SBO:0000626" units="mmol_per_gDW_per_hr" value="-999999" />
         <parameter constant="true" id="cobra_default_ub" sboTerm="SBO:0000626" units="mmol_per_gDW_per_hr" value="999999" />
         <parameter constant="true" id="cobra_0_bound" sboTerm="SBO:0000626" units="mmol_per_gDW_per_hr" value="0" />
         <parameter constant="true" id="R_ATPM_upper_bound" sboTerm="SBO:0000625" units="mmol_per_gDW_per_hr" value="7.6" />
         <parameter constant="true" id="R_ATPM_lower_bound" sboTerm="SBO:0000625" units="mmol_per_gDW_per_hr" value="7.6" />
         <parameter constant="true" id="R_EX_glc_DASH_D_e_lower_bound" sboTerm="SBO:0000625" units="mmol_per_gDW_per_hr" value="-10" />
         <parameter constant="true" id="R_EX_o2_e_lower_bound" sboTerm="SBO:0000625" units="mmol_per_gDW_per_hr" value="-20" />
       </listOfParameters>
       <listOfCompartments> Compartments</listOfCompartments>
       <listOfSpecies> Species</listOfSpecies>
       <fbc:listOfGeneProducts> Products </fbc:listOfGeneProducts>
       <listOfReactions>
         <reaction fast="false" id="R_12PPDt" name="S-Propane-1,2-diol facilitated transport" reversible="true" fbc:lowerFluxBound="cobra_default_lb" fbc:upperFluxBound="cobra_default_ub">
         </reaction>
         <reaction fast="false" id="R_2DGLCNRx" name="2-dehydro-D-gluconate reductase (NADH)" reversible="false" fbc:lowerFluxBound="cobra_0_bound" fbc:upperFluxBound="cobra_default_ub">
         </reaction>
       </listOfReactions>
   </model>
</sbml>

我用Python编写的代码如下

import xml.etree.ElementTree as ET
mytree =  ET.parse('iJR904.xml')
myroot = mytree.getroot()

mychild = myroot[0]

for a in range(len(mychild[6])):
       print(mychild[6][a].get('id'),':',mychild[6][a].get('fbc:lowerFluxBound'))

它打印:

R_12PPDt : none
R_2DGLCNRx : none

因为我想要的不是真正的文本,所以我想我可以使用一些if如下:

for a in range(len(mychild[6])):
    if mychild[6][a].get('fbc:lowerFluxBound') == 'cobra_default_lb':
        print(mychild[6][a].get('id'),':',-999999)

    elif mychild[6][a].get('fbc:lowerFluxBound') == 'cobra_0_bound':
        print(mychild[6][a].get('id'),':',0)

Tags: idtruegetparameterhrunitsconstantper
1条回答
网友
1楼 · 发布于 2024-09-30 06:23:38

你是一个很好的研究者,能够找出问题所在。这应该是由XML语法中的名称空间引起的。以下库忽略名称空间的语法,并将其视为普通字符串

from simplified_scrapy import SimplifiedDoc, utils

xml = utils.getFileContent('iJR904.xml')
doc = SimplifiedDoc(xml)
listOfReactions = doc.selects('listOfReactions>reaction')
# print (listOfReactions)

print ([(a.id,a['fbc:lowerFluxBound']) for a in listOfReactions])

结果:

[('R_12PPDt', 'cobra_default_lb'), ('R_2DGLCNRx', 'cobra_0_bound')]

相关问题 更多 >

    热门问题