2016-01-11 64 views
0

R中使用XML2的SBML文件我是真正的新xml我试图在R使用xml2包读取sbml文件。阅读使用XPath

演示sbml文件取自sbml主要page

我很困惑如何使用xpath搜索节点。

例如,我试图

test <- read_xml("./scratch.xml") 
xml_children(test)[1] 
xml_attr(xml_children(test)[1], "name") 

的作品,给我"EnzymaticReaction"的答案。但是,我不希望访问由索引节点,但名字 - 所以我试图

xml_find_one(test, ".//model") 

这给了我错误

Error: No matches 

谁能帮助我为我在做什么错打电话xpathsbml文件也粘贴在下面。

谢谢!

<?xml version="1.0" encoding="UTF-8"?> 
<sbml level="2" version="3" xmlns="http://www.sbml.org/sbml/level2/version3"> 
    <model name="EnzymaticReaction"> 
     <listOfUnitDefinitions> 
      <unitDefinition id="per_second"> 
       <listOfUnits> 
        <unit kind="second" exponent="-1"/> 
       </listOfUnits> 
      </unitDefinition> 
      <unitDefinition id="litre_per_mole_per_second"> 
       <listOfUnits> 
        <unit kind="mole" exponent="-1"/> 
        <unit kind="litre" exponent="1"/> 
        <unit kind="second" exponent="-1"/> 
       </listOfUnits> 
      </unitDefinition> 
     </listOfUnitDefinitions> 
     <listOfCompartments> 
      <compartment id="cytosol" size="1e-14"/> 
     </listOfCompartments> 
     <listOfSpecies> 
      <species compartment="cytosol" id="ES" initialAmount="0"  name="ES"/> 
      <species compartment="cytosol" id="P" initialAmount="0"  name="P"/> 
      <species compartment="cytosol" id="S" initialAmount="1e-20" name="S"/> 
      <species compartment="cytosol" id="E" initialAmount="5e-21" name="E"/> 
     </listOfSpecies> 
     <listOfReactions> 
      <reaction id="veq"> 
       <listOfReactants> 
        <speciesReference species="E"/> 
        <speciesReference species="S"/> 
       </listOfReactants> 
       <listOfProducts> 
        <speciesReference species="ES"/> 
       </listOfProducts> 
       <kineticLaw> 
        <math xmlns="http://www.w3.org/1998/Math/MathML"> 
         <apply> 
          <times/> 
          <ci>cytosol</ci> 
          <apply> 
           <minus/> 
           <apply> 
            <times/> 
            <ci>kon</ci> 
            <ci>E</ci> 
            <ci>S</ci> 
           </apply> 
           <apply> 
            <times/> 
            <ci>koff</ci> 
            <ci>ES</ci> 
           </apply> 
          </apply> 
         </apply> 
        </math> 
        <listOfParameters> 
         <parameter id="kon" value="1000000" units="litre_per_mole_per_second"/> 
         <parameter id="koff" value="0.2"  units="per_second"/> 
        </listOfParameters> 
       </kineticLaw> 
      </reaction> 
      <reaction id="vcat" reversible="false"> 
       <listOfReactants> 
        <speciesReference species="ES"/> 
       </listOfReactants> 
       <listOfProducts> 
        <speciesReference species="E"/> 
        <speciesReference species="P"/> 
       </listOfProducts> 
       <kineticLaw> 
        <math xmlns="http://www.w3.org/1998/Math/MathML"> 
         <apply> 
          <times/> 
          <ci>cytosol</ci> 
          <ci>kcat</ci> 
          <ci>ES</ci> 
         </apply> 
        </math> 
        <listOfParameters> 
         <parameter id="kcat" value="0.1" units="per_second"/> 
        </listOfParameters> 
       </kineticLaw> 
      </reaction> 
     </listOfReactions> 
    </model> 
</sbml> 
+0

您的XML文档具有_default命名空间_。这意味着,在您的R代码中,需要声明该名称空间URI,并且需要在XPath表达式中为元素名称添加前缀。 –

+0

感谢您的评论,您能否以示例的形式告诉我如何按名称获取'model'节点? – SN248

+0

我的解决方案是否回答您的问题? –

回答

2

在你的输入文档,有一个默认命名空间

<sbml xmlns="http://www.sbml.org/sbml/level2/version3"> 

适用于在默认情况下所有元素。像

//model 

XPath表达式意味着寻找一个元素没有命名空间 - 但你的文档中,没有model节点是没有命名空间。

我对R并不熟悉,所以我只能提出一些更多的解决方法而不是答案。解决方法是不直接提及元素的名称,而是使用XPath表达式像

//*[local-name() = 'model'] 

但忽略了命名空间是不如直接在您的代码不谈。


同时,我读过有关这here ...

真正的解决方案是使用一种方法来在R代码里面声明空间URI从您的输入文档,并使用XPath表达式中的前缀。我认为,正确的方式做这将是

ns <- xml_ns_rename(xml_ns(test), d1 = "sbml") 
xml_find_one(test, "/sbml:sbml/sbml:model", ns) 

改名并非绝对必要,但它是有帮助的。 XML文档中的默认名称空间被这个XML库命名为d1d2等等。