2013-12-19 63 views
10

我何時想使用xmlParse功能與xmlTreeParse功能?另外,何時有參數值useInternalNodes=TRUEasText=TRUE有用?在R XML包中,xmlParse和xmlTreeParse有什麼區別?

例如:

library("XML") 
nct_url <- "http://clinicaltrials.gov/ct2/show/NCT00112281?resultsxml=true" 
xml_doc <- xmlParse(nct_url, useInternalNodes=TRUE) 

doc <- xmlTreeParse(getURL(nct_url), useInternalNodes=TRUE) 
top <- xmlRoot(doc) 
top[["keyword"]] 
xmlValue(top[["start_date"]]) 
xmlValue(top[["location"]]) 

人們似乎使用xmlTreeParse功能通過$ DOC $孩子得到一個不重複的節點$ ...遍歷。但我不確定何時每種方法都是最好的。解析XML是幾乎放棄R並學習Python的原因之一。沒有被迫購買書籍的缺乏示例。

回答

12

我不是一個XML專家,所以這個答案是基於我自己的XML包的經驗。

  • xmlParsexmlTreeParse一個版本,其中參數useInternalNodes設置爲TRUE。
  • 如果您想獲得R對象,請使用xmlTreeParse。如果只想提取xml文檔的部分內容,這可能不是非常有效且不必要的。
  • 如果你不想得到一個R對象,只需一個c指針,使用xmlParse。但你應該知道一些xpath基地來操縱結果。
  • 如果您的文本不是文件或網址作爲輸入,請使用asText=TRUE

在這裏,我展示了兩個功能之間的區別的例子:

txt <- "<doc> 
      <el> aa </el> 
     </doc>" 
library(XML) 
res <- xmlParse(txt,asText=TRUE) 
res.tree <- xmlTreeParse(txt,asText=TRUE) 

現在檢查2個對象:

class(res) 
[1] "XMLInternalDocument" "XMLAbstractDocument" 
> class(res.tree) 
[1] "XMLDocument"   "XMLAbstractDocument" 

你看那個水庫是內部文件。它是指向C對象的指針。 res.tree是一個R對象。你可以得到它的屬性是這樣的:

res.tree$doc$children 
$doc 
<doc> 
<el>aa</el> 
</doc> 

對於資源,你應該使用一個有效xpath要求和論文功能(xpathApplyxpathSApplygetNodeSet),以檢查它一個。例如:

xpathApply(res,'//el') 

一旦你創建了一個有效的XML節點,你可以申請xmlValuexmlGetAttr,..提取節點的信息。所以這裏的這兩條語句是等效的:

## we have already an R object, just apply xmlValue to the right child 
xmlValue(res.tree$doc$children$doc) 
## xpathSApply create an R object and pass it to 
xpathSApply(res,'//el',xmlValue)  
相關問題