我想在药库中获得所有药物名称(如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")
答案 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"