2015-07-03 40 views
2

我想要在藥庫中獲得所有藥物名稱(如Lepirudin)。該drugbank.xml下載drugbank通過Xpath中的一個xml文件中的節點獲取值R

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

然而,tmp是一個空列表。只是找不到有什麼問題。謝謝。

更新(A再現的示例):

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") 
+3

你應該包括[重複的例子(HTTP:/ /stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)在你的問題。一種不涉及下載和解壓縮大型XML文件的方法。 – MrFlick

+0

@MFFlick謝謝。請參閱更新。 –

回答

2

問題是默認的命名空間。 XML包在使用默認名稱空間的XPATH查詢時遇到問題。您必須自己明確定義它們。這應該適用於你的榜樣

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"