首页 > 解决方案 > `R::XML` : xmlParse(isURL = TRUE) 不起作用 (?) 并且 XPath 在多个节点上带有子字符串

问题描述

我从 NCBI 下载了一个 XML 文件,其中包含对应于 2 个核苷酸序列的分类值。我想使用RandXPath表达式提取这 2 个出租车值。

问题 1

在下面的代码中,我将 url 传递给RCurl::getURL()然后传递给 XML::xmlParse(). 是否可以将网址直接传递给 XML::xmlParse()?我试过XML::xmlParse(efetch_url, isURL = TRUE)但无济于事。
我看到很多使用 的示例RCurl,所以也许有充分的理由这样做并且不将 url 直接传递给xmlParse?

library(XML)
library(RCurl)

efetch_url <- "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=nuccore&rettype=gb&retmode=xml&id=MZ959190,MZ959191"
xml <- efetch_url |> RCurl::getURL() |> XML::xmlParse()

问题2

通过以下 2 个 XPath 查询,我设法提取了正确的节点(两种语法的结果相同)

taxid <- xmlValue(getNodeSet(xml, "//GBQualifier[./GBQualifier_name = 'db_xref']/GBQualifier_value"))
taxid <- xmlValue(getNodeSet(xml, "//GBQualifier_value[contains(.,'taxon:')]"))
taxid
#> [1] "taxon:2849586" "taxon:52462"

但我需要没有taxon:部分的 ID。我可以在 R 中做到这一点:

gsub("taxon:", "", taxid)
#> [1] "2849586" "52462"

但我想要一个纯粹的 XPath 解决方案。

我试过这个,但我只得到第一个 ID 的值:

getNodeSet(xml, "substring(//GBQualifier_value[contains(.,'taxon:')], 7, 10000)")
#> [1] "2849586"

同样的问题 :

getNodeSet(xml, "substring-after(//GBQualifier_value[contains(.,'taxon:')],'taxon:')")
#> [1] "2849586"

我对使用 XPath 的几种替代解决方案感兴趣(以了解有关此查询语言的更多信息)并了解为什么这些最后的查询不能按我预期的那样工作。

标签: rxmlxpath

解决方案


推荐阅读