2010-01-14 6 views
32

J'essaie d'apprendre le paquet XML de R. J'essaie de créer un data.frame à partir du fichier de données xml books.xml. Voici ce que je reçois:Comment transformer des données XML en un 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) 

Chacun de ces xpathSApply de ne me obtiennent même pas près de mon intention. Comment devrait-on procéder vers un data.frame bien formé?

Répondre

36

D'habitude, je suggère d'essayer la fonction xmlToDataFrame(), mais je crois que ce sera en fait assez difficile, car il n'est pas bien structuré pour commencer.

Je recommande de travailler avec cette fonction:

xmlToList(books) 

Un problème est qu'il ya plusieurs auteurs par livre, vous aurez donc besoin de décider comment gérer que lorsque vous structurez votre trame de données. Une fois que vous avez décidé quoi faire avec le problème des auteurs multiples, il est assez simple de transformer votre liste de livres en un cadre de données avec la fonction ldply() dans plyr (ou simplement utiliser lapplication et convertir la valeur de retour en données . .frame en utilisant do.call ("rbind" ...)

Voici un exemple complet (auteur exclusion):.

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 

est ici à quoi il ressemble avec l'auteur inclus Vous devez utiliser ldply dans ce cas, puisque la liste est "dentelée" ... lapply ne peut pas gérer cela correctement. [Sinon, vous pouvez utiliser lapply avec rbind.fill (également avec la permission de Hadley), mais pourquoi s'embêter quand plyr il fait automatiquement pour vous]:

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

« mais pourquoi pris la peine quand plyr il le fait automatiquement pour vous » je me trouve en disant qu'énormément . –

+0

Question: dans mon cas, le code produit une erreur "Impossible de charger la ressource HTTP Erreur: 1: Echec du chargement de la ressource HTTP". Pourquoi donc? – user2006697

+2

@ user2006697 le lien est déplacé vers: "http://www.w3schools.com/xsl/books.xml" – zyurnaidi

Questions connexes