通过R中的Xpath从xml文件中的节点获取值

时间:2015-07-03 15:06:26

标签: xml r xpath

我想在药库中获得所有药物名称(如Lepirudin)。 drugbank.xml已下载drugbank

require(XML)
drugbank<-  xmlParse("drugbank.xml")
tmp <- getNodeSet(drugbank, "//drug/name")

但是,tmp是一个空列表。只是找不到什么错。谢谢。

更新(可重现的例子):

require(XML)
xf <- '<?xml version="1.0" encoding="UTF-8"?>
<drugbank xmlns="http://www.drugbank.ca" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.drugbank.ca http://www.drugbank.ca/docs/drugbank.xsd" version="4.3">
<drug type="biotech" created="2005-06-13" updated="2015-02-23">
  <drugbank-id primary="true">DB00001</drugbank-id>
  <drugbank-id>BIOD00024</drugbank-id>
  <drugbank-id>BTD00024</drugbank-id>
  <name>Lepirudin</name>
</drug>
<drug type="biotech" created="2005-06-13" updated="2011-07-31">
  <drugbank-id primary="true">DB00002</drugbank-id>
  <drugbank-id>BIOD00071</drugbank-id>
  <drugbank-id>BTD00071</drugbank-id>
  <name>Cetuximab</name>
</drug>
</drugbank>
'
drugbank<-  xmlParse(xf,  asText=TRUE)
tmp <- getNodeSet(drugbank, "//drug/name")

1 个答案:

答案 0 :(得分:2)

问题是默认命名空间。使用具有默认命名空间的XPATH查询时,XML包存在问题。您必须自己明确定义它们。这适用于您的示例

drugbank<-  xmlParse(xf,  asText=TRUE)
ns<-c("db"="http://www.drugbank.ca")
getNodeSet(drugbank, "//db:drug/db:name", namespaces=ns)

返回

[[1]]
<name>Lepirudin</name> 

[[2]]
<name>Cetuximab</name> 

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

如果您只想要名字,可以

xpathSApply(xmlRoot(drugbank), "//db:drug/db:name", xmlValue, namespaces=ns)
# [1] "Lepirudin" "Cetuximab"