2010-01-14 127 views
32

我正試圖學習R的XML包。我試圖從books.xml示例xml數據文件創建一個data.frame。這裏是我得到的:如何將XML數據轉換爲data.frame?

library(XML) 
books <- "http://www.w3schools.com/XQuery/books.xml" 
doc <- xmlTreeParse(books, useInternalNodes = TRUE) 
doc 
xpathApply(doc, "//book", function(x) do.call(paste, as.list(xmlValue(x)))) 
xpathSApply(doc, "//book", function(x) strsplit(xmlValue(x), " ")) 
xpathSApply(doc, "//book/child::*", xmlValue) 

這些xpathSApply的每一個都沒有讓我接近我的意圖。應該如何進行一個良好的數據框?

回答

36

通常,我會建議嘗試使用xmlToDataFrame()函數,但我相信這實際上會相當棘手,因爲它的結構並不完善。

我會建議使用此功能工作:

xmlToList(books) 

的一個問題是,有每本書多個作者,所以你需要決定如何處理,當你構建你的數據幀。

一旦你決定了如何處理多個作者的問題,那麼它是相當直接的將您的書籍列表轉換爲plyr中ldply()函數的數據框(或者只是使用lapply並將返回值轉換爲數據通過使用do.call(「rbind」 ...).frame

這裏有一個完整的示例(不含作者):

library(XML) 
books <- "w3schools.com/xsl/books.xml" 
library(plyr) 
ldply(xmlToList(books), function(x) { data.frame(x[!names(x)=="author"]) }) 

    .id  title.text title..attrs year price .attrs 
1 book Everyday Italian   en 2005 30.00 COOKING 
2 book  Harry Potter   en 2005 29.99 CHILDREN 
3 book XQuery Kick Start   en 2003 49.99  WEB 
4 book  Learning XML   en 2003 39.95  WEB 

下面是它看起來像筆者包含您需要使用ldply在這種情況下,因爲列表是「鋸齒狀的」...... lapply無法正確處理。[否則可以使用lapplyrbind.fill(也哈德利提供),但何必當plyr自動會爲你]:

ldply(xmlToList(books), data.frame) 

    .id  title.text title..attrs    author year price .attrs 
1 book Everyday Italian   en Giada De Laurentiis 2005 30.00 COOKING 
2 book  Harry Potter   en  J K. Rowling 2005 29.99 CHILDREN 
3 book XQuery Kick Start   en  James McGovern 2003 49.99  WEB 
4 book  Learning XML   en   Erik T. Ray 2003 39.95  WEB 
    author.1 author.2 author.3    author.4 
1  <NA>  <NA>  <NA>     <NA> 
2  <NA>  <NA>  <NA>     <NA> 
3 Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 
4  <NA>  <NA>  <NA>     <NA> 
+7

「?但爲什麼還要當plyr自動爲您完成」我發現自己說,一個可怕的很多。 – 2010-01-14 20:32:29

+0

問題:在我的情況下,代碼產生一個錯誤「未能加載HTTP資源錯誤:1:未能加載HTTP資源」。這是爲什麼? – user2006697 2016-03-11 07:53:19

+2

@ user2006697將鏈接移至:「http://www.w3schools.com/xsl/books.xml」 – zyurnaidi 2016-05-21 04:03:47