使用xpath在R中使用xml2读取sbml文件
Reading an sbml file using xml2 in R using xpath
我是 xml
的新手,我正在尝试使用 R
中的 xml2
包读取 sbml
文件。
演示 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
任何人都可以帮助我知道我在 xpath
打电话时做错了什么吗? sbml
文件也粘贴在下面。
谢谢!
<?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>
在您的输入文档中,有一个默认命名空间:
<sbml xmlns="http://www.sbml.org/sbml/level2/version3">
默认情况下适用于所有元素。像
这样的 XPath 表达式
//model
表示在 no 命名空间中查找元素 - 但在您的文档中,没有 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 库命名为 d1
、d2
等等。
我是 xml
的新手,我正在尝试使用 R
中的 xml2
包读取 sbml
文件。
演示 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
任何人都可以帮助我知道我在 xpath
打电话时做错了什么吗? sbml
文件也粘贴在下面。
谢谢!
<?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>
在您的输入文档中,有一个默认命名空间:
<sbml xmlns="http://www.sbml.org/sbml/level2/version3">
默认情况下适用于所有元素。像
这样的 XPath 表达式//model
表示在 no 命名空间中查找元素 - 但在您的文档中,没有 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 库命名为 d1
、d2
等等。