¿Cómo transformar datos XML en un data.frame?

Estoy intentando aprender el paquete XML de R. Estoy tratando de crear un data.frame del archivo de datos books.xml xml data. Esto es lo que obtengo:

 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) 

Cada uno de estos xpathSApply no me acerca ni a mi intención. ¿Cómo se debe proceder hacia un data.frame bien formado?

Normalmente, sugeriría probar la función xmlToDataFrame() , pero creo que esto en realidad será bastante complicado porque, para empezar, no está bien estructurado.

Yo recomendaría trabajar con esta función:

 xmlToList(books) 

Un problema es que hay varios autores por libro, por lo que tendrá que decidir cómo manejarlo cuando esté estructurando su dataframe.

Una vez que haya decidido qué hacer con el problema de múltiples autores, entonces es bastante sencillo convertir su lista de libros en un dataframe con la función ldply() en plyr (o simplemente use lapply y convierta el valor devuelto en un data.frame mediante el uso de do.call (“rbind” …).

Aquí hay un ejemplo completo (excluyendo el autor):

 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 

Esto es lo que parece con el autor incluido. Necesita usar ldply en esta instancia ya que la lista es "irregular" ... lapply no puede manejar eso correctamente. [De lo contrario, puede utilizar lapply con rbind.fill (también cortesía de Hadley), pero ¿por qué molestarse cuando plyr hace automáticamente por usted?]:

 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     2     3 Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 4