2017-05-30 3 views
0

Ich habe ein Problem. Ich habe ein XML-Dokument und ich brauche es in eine data.frame in R. bisher habe ich es geschafft, eine einfache XML in eine data.frame der diese Pakete mit xml und plyr undXML-Dokument in data.frame in R

dataframe=ldply(xmlToList("file.xml"), data.frame) 

tun zu laden, aber wenn ich betreibe dieses xml:

<BusinessUnitList> 
    <BusinessUnit id="000000195"> 
     <User id="897654322" firstName="Rick" lastName="Test" middleName="R" defaultLanguageName="English"> 
     <RoleList> 
      <Role id="worker"/> 
     </RoleList> 
     <OrgList> 
      <Organization id="1111"/> 
     </OrgList> 
     <Address country="Italy"/> 
     <Employee badgeNumber="575757" Date="2017-01-01" DateNew="2017-01-02" birthDate="1999-01-01"> 
      <Availability val1="5" val2="n" val3="6" HoursPerWeek="33.75" HoursBetweenShifts="10" minHoursPerWeek="00.00"/> 
     </Employee> 
     </User> 
</BusinessUnit> 
    <BusinessUnit id="000000111"> 
     <User id="897652222" firstName="TERI" lastName="tst2" middleName="D" defaultLanguageName="English"> 
     <RoleList> 
      <Role id="worker"/> 
     </RoleList> 
     <OrgList> 
      <Organization id="2222"/> 
     </OrgList> 
     <Address country="Portugal"/> 
     <Employee badgeNumber="575757" Date="2017-02-02" DateNew="2017-02-02" birthDate="1998-01-01"> 
      <Availability val1="5" val2="n" val3="6" HoursPerWeek="33.75" HoursBetweenShifts="10" minHoursPerWeek="00.00"/> 
     </Employee> 
     </User> 
     </BusinessUnit> 
    </BusinessUnitList> 

i einen Fehler erhalten: Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : arguments imply differing number of rows: 9, 7.

+0

Bitte Beispieldaten und Code angeben. – PhilC

+2

Um Ihnen helfen zu können, müssten wir verstehen, was Sie für das Format der Ausgabe erwarten (welche Informationen wollen Sie in welcher Spalte?) – sinQueso

+0

Es ist unwahrscheinlich, dass [xml] [1] 'in der eigentlichen XML ist Datei. Sie sollten sich etwas Zeit nehmen, um den Fehler zu verstehen (mindestens eine Spalte enthält nicht die gleiche Anzahl an Einträgen). Sie müssen wahrscheinlich tatsächlich arbeiten, wie es oft bei XML-Dateien der Fall ist. Es gibt Unmengen von XML, die Q & A's auf SO behandeln. Du scheinst absolut keine Nachforschungen gemacht zu haben. – hrbrmstr

Antwort

0

Sie versuchen, eine Liste wie diese

zu kombinieren
list(a=1:2, b=3:5) 
$a 
[1] 1 2 

$b 
[1] 3 4 5 

data.frame(list(a=1:2, b=3:5)) 
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : 
    arguments imply differing number of rows: 2, 3 

Ich würde vielleicht die xmlToList Ergebnisse aufheben und die Spaltennamen formatieren.

doc <- xmlParse("file.xml") 
x <- data.frame(t(unlist(xmlToList(doc)))) 
names(x) <- gsub("(..attrs)?.id$", "_id", names(x)) 
names(x) <- gsub(".*\\.", "", names(x)) 

    Role_id Organization_id country val1 val2 val3 HoursPerWeek HoursBetweenShifts minHoursPerWeek badgeNumber  Date DateNew birthDate User_id firstName lastName middleName defaultLanguageName BusinessUnit_id 
1 worker   1111 Italy 5 n 6  33.75     10   00.00  575757 2017-01-01 2017-01-02 1999-01-01 897654322  Rick  Test   R    English  000000195 
+0

Hallo Chris, danke für deine Zeit. Ich konnte das Beispiel ausführen und es funktioniert OK, es formatiert die erwarteten Daten, aber wenn ich ein zweites Kind hinzufüge, zeigt die Ausgabe im Datenrahmen nur einen Datensatz (den letzten) und ich habe mehr Datensätze. Die lustige Sache ist, dass, wenn ich das "x" -Objekt drucke, die Konsole meine zwei Aufzeichnungen druckt, so verstehe ich nicht, warum dieses Verhalten. Irgendwann fehlen mir auch Daten, ich werde das XML aktualisieren, damit Sie meinen Standpunkt verstehen. –