如何将XML数据转换为data.frame?

我正在学习R的XML包。 我试图从books.xml示例xml数据文件创build一个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中的每一个都不会让我接近我的意图。 应该如何进行一个良好的数据框?

通常,我会build议尝试xmlToDataFrame()函数,但我相信这实际上是相当棘手的,因为它不是很好的结构开始。

我会build议使用这个function:

 xmlToList(books) 

一个问题是,每本书有多个作者,所以当你构build数据框架时,你需要决定如何处理。

一旦你决定了如何处理多个作者问题,那么使用plyr中的ldply()函数将你的书籍列表变成一个数据框是相当直接的(或者只是使用lapply并将返回值转换为data.frame通过使用do.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 (也是Hadley提供的)使用lapply ,但是为什么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>