通常,我会建议尝试该xmlToDataFrame()
功能,但我相信这实际上会相当棘手,因为它一开始的结构并不好。
我建议使用此功能:
xmlToList(books)
一个问题是每本书有多个作者,因此在构建数据框时需要决定如何处理。
一旦您决定如何处理多作者问题,那么ldply()
使用 plyr 中的函数将您的书单转换为数据框(或仅使用 lapply 并使用 do 将返回值转换为 data.frame )是相当简单的.call("rbind"...)。
这是一个完整的例子(不包括作者):
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 无法正确处理。[否则你可以使用lapply
with rbind.fill
(也由 Hadley 提供),但为什么要在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>