2016-11-06 2 views
1

Ich habe eine XML-Datei mit Knoten mit dem gleichen Namen und ich kann nicht herausfinden, wie Sie die Daten auswählen, die ich möchte, um einen Datenrahmen zu erstellen. Ich bin neu in R und XML und ich kann es nicht funktionieren lassen!Parsing XML zu R wenn mehrere Knoten mit den gleichen Namen

Meine XML sieht aus wie (nur der Anfang):

<GL_Document xmlns=""> 
    <time_Period.timeInterval>...</time_Period.timeInterval> 
    <TimeSeries> 
     <mRID>1</mRID> 
     <MktPSRType> 
      <psrType>ProdType1</psrType> 
     </MktPSRType> 
     <Period> 
      <timeInterval> 
       <start>2015-12</start> 
       <end>2016-11</end> 
      </timeInterval> 
      <resolution>PT60M</resolution> 
      <Point> 
       <position>1</position> 
       <quantity>9</quantity> 
      </Point> 
      <Point> 
       <position>2</position> 
       <quantity>7</quantity> 
      </Point> 
      <Point> 
       <position>3</position> 
       <quantity>9</quantity> 
      </Point> 

Der Code verschiedene Knoten namens „Timeseries“ mit der gleichen Art von Daten (hier Zeitraum entwickelt wird, nicht um die gesamte Struktur zu sehen, enthält)

<GL_Document xmlns=""> 
    <time_Period.timeInterval>...</time_Period.timeInterval> 
    <TimeSeries> 
     <mRID>1</mRID> 
     <MktPSRType> 
      <psrType>ProdType1</psrType> 
     </MktPSRType> 
     <Period>...</Period> 
    </TimeSeries> 
    <TimeSeries> 
     <mRID>2</mRID> 
     <MktPSRType> 
      <psrType>ProdType2</psrType> 
     </MktPSRType> 
     <Period>...</Period> 
    </TimeSeries> 
    <TimeSeries>...</TimeSeries> 
    <TimeSeries>...</TimeSeries> 
    <TimeSeries>...</TimeSeries> 
    <TimeSeries>...</TimeSeries> 
    <TimeSeries>...</TimeSeries> 
</GL_Document> 

ich möchte die Daten in folgendem Format erhalten:

psrType position quantity 
ProdType1 1   9 
...  ...  ... 
ProdType2 1   ... 

Ich habe versucht, die Lösungen wie in diesem Beitrag erwähnt zu verwenden: How to parse XML to R data frame Aber ohne Erfolg. Mein Code sieht wie folgt aus, aber ich die resultierende Datenrahmen enthält keine Daten:

xml.url3<-getURL(xml.file3) 
doc<-xmlParse(xml.url3) 

position_path<-"//GL_Document/TimeSeries/Period/Point/position" 
quantity_path<-"//GL_Document/TimerSeries/Period/Point/quantity" 

df<-data.frame(
    pos=as.integer(sapply(doc[position_path],as,"integer")), 
    quant=as.integer(sapply(doc[quantity_path],as,"integer"))) 

Vielen Dank für Ihre Hilfe!

+0

Ok, so schließlich ist es das, was ich getan habe: 'xml. fileexp <- "https://website.com" xml.urlexp <-getURL (xml.fileexp) doc <-xmlParse (xml.urlexp) df <- ldply (xmlToList (doc), data.frame) dfexp <-df [df $ .id == "TimeSeries",] ' – Daldal

+0

Ok Entschuldigung, ich muss zweimal kommentieren Bearbeitung! Dann hatte ich einen Datenrahmen mit allen Dingen in meinen Zeitreihen Knoten aufgelistet (in Zeilen). Da Start- und Stoppzeit angegeben wurden, konnte ich einen Code schreiben, der die Anzahl der Positionen im Intervall berücksichtigt. Wahrscheinlich nicht die cleverste Lösung, aber es funktioniert! – Daldal

Antwort

0

Ich glaube, Sie könnten finden, was Sie brauchen hier: How to transform XML data into a data.frame?

Diese xmlToList() über rechts schaut. Sie können es dann in einen Datenrahmen bringen, indem Sie eine der Methoden anwenden. Es gibt eine große Erklärung unter dem obigen Link!

0

Verwenden Sie XMLs xpathSApply(), um direkte XPath-Ausdrücke auszuführen. Für den psrType Wert, verwenden ancestor::* die data.frame() bildet den einen Wert pro <TimeSeries> zu jeweils entsprechenden Werten von Periode und Menge:

library(XML) 

xml.url3 <- getURL(xml.file3) 
doc <- xmlParse(xml.url3) 

period <- xpathSApply(doc, "//Point/position", xmlValue) 
quantity <- xpathSApply(doc, "//Point/quantity", xmlValue) 
psrType <- xpathSApply(doc, "//Point/ancestor::TimeSeries/MktPSRType/psrType", xmlValue) 

df <- data.frame(psrType = psrType, 
       period = as.integer(period), 
       quantity = as.integer(quantity)) 

df 
#  psrType period quantity 
# 1 ProdType2  1  9 
# 2 ProdType2  2  7 
# 3 ProdType2  3  9 
Verwandte Themen