使用R中的getNodeSet进行复杂的xPath查询

时间:2014-04-22 05:23:43

标签: xml r xpath

我从Uniprot蛋白质数据库下载了以下xml文件。

protein <- xmlRoot(xmlTreeParse("http://www.uniprot.org/uniprot/Q01974.xml"))

从众多注释功能中,我对存储在以下xml节点中的激酶域的起始位置和结束位置感兴趣:

<feature type="domain" description="Protein kinase">
<location>
<begin position="288"/>
<end position="539"/>
</location>
</feature>

使用getNodeSet,我可以很好地找到这个标签:

getNodeSet(protein, "//uniprot:feature[@type=\"domain\" and @description=\"Protein kinase\"]", c(uniprot="http://uniprot.org/uniprot"))

不幸的是我无法缩小查询范围,添加任何其他条件都会返回一个空列表。例如:

getNodeSet(protein, "//uniprot:feature[@type=\"domain\" and @description=\"Protein kinase\"]/location", c(uniprot="http://uniprot.org/uniprot"))

基于在线xpath测试器,应该是有效的xpath查询,但返回空:

list()
attr(,"class")
[1] "XMLNodeSet"

有人可以帮我这个查询吗? 我确信这是getNodeSet的正常行为,但我不知道它背后的理性是什么。 一般来说,在R中用短语表达这种相对复杂的查询的最合适方法是什么?我应该存储结果然后进一步缩小范围吗?

非常感谢!

1 个答案:

答案 0 :(得分:2)

也为后续元素使用相同的前缀:

//uniprot:feature[...]/uniprot:location

prefix + local-name标识每个元素。如果您使用带有默认命名空间的XML(似乎这就是您所拥有的),则在默认命名空间中考虑所有不带前缀的元素。这就是为什么你需要为XPath中的每个元素使用前缀* 的原因(不仅仅是第一个元素)。

*)指向默认命名空间URI的前缀