2017-12-06 5 views
0

Ich habe eine folgende XML-DateiR: Parsen von XML in R

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
<t:Forecast xmlns:t="http://example.com"> 
     <Sender Abbreviation="abc" Name="xyz"/> 
     <Recipient Abbreviation="efg" Name="cba"/> 
     <createdUTC>2017-11-24T10:41:11Z</createdUTC> 
     <MessageID>bcjs</MessageID> 
     <SystemState>test</SystemState> 
     <ForecastData> 
      <DataHeader GroupKey="rkolo"> 

      <Timeseries ID="abc123"> 
       <TimeInt ISTUTC="2017-11-24T10:45:00Z" Out="858"/> 
       <TimeInt ISTUTC="2017-11-24T11:45:00Z" Out="868"/> 
      </Timeseries> 

      <Timeseries ID="xyz"> 
       <TimeInt ISTUTC="2017-11-24T10:45:00Z" Out="870"/> 
       <TimeInt ISTUTC="2017-11-24T11:45:00Z" Out="890"/> 
      </Timeseries> 
     </ForecastData> 
</t:Forecast> 

Ich mag würde zwei Daten haben Rahmen

TimeInt     out 
2017-11-24T10:45:00Z 858 
2017-11-24T11:45:00Z 868 

und eine andere Datenrahmen als

TimeInt     out 
2017-11-24T10:45:00Z 870 
2017-11-24T11:45:00Z 890 

So Bisher habe ich folgendes gemacht:

require(XML) 

temp = xmlParse("datafile.xml") 
data = xmlToList(temp) 

Aber die Ausgabe von data enthält viele verschachtelte Listen. Wie bekomme ich die Datenframes?

Edit 1: Werte geändert out

+0

Nochmals vielen Dank. 'Out' wird nicht so als Gruppenindikator gepaart. –

Antwort

1

Betrachten die triple-Doppelpunkt-Methode xmlAttrsToDataFrame aber durch jeden Knotenindex von Zeitreihe Looping, auch mit der entsprechenden ZeitreiheID jedes Element nennen.

library(XML) 

txt='<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?> 
    <t:Forecast xmlns:t="http://example.com"> 
     <Sender Abbreviation="abc" Name="xyz"/> 
     <Recipient Abbreviation="efg" Name="cba"/> 
     <createdUTC>2017-11-24T10:41:11Z</createdUTC> 
     <MessageID>bcjs</MessageID> 
     <SystemState>test</SystemState> 
     <ForecastData> 
      <DataHeader GroupKey="rkolo"/> 
      <Timeseries ID="abc123"> 
       <TimeInt ISTUTC="2017-11-24T10:45:00Z" Out="858"/> 
       <TimeInt ISTUTC="2017-11-24T11:45:00Z" Out="858"/> 
      </Timeseries> 

      <Timeseries ID="xyz"> 
       <TimeInt ISTUTC="2017-11-24T10:45:00Z" Out="870"/> 
       <TimeInt ISTUTC="2017-11-24T11:45:00Z" Out="870"/> 
      </Timeseries> 
     </ForecastData> 
    </t:Forecast>' 

doc <- xmlParse(txt) 

dfList <- lapply(1:length(xpathSApply(doc, "//Timeseries", xmlAttrs)), function(i) 
    XML:::xmlAttrsToDataFrame(getNodeSet(doc, path=paste0('//Timeseries[',i,']/TimeInt'))) 
) 

dfList <- setNames(dfList, xpathSApply(doc, path='//Timeseries', xmlAttrs)) 
dfList 

Ausgabe

dfList$abc123 
#     ISTUTC Out 
# 1 2017-11-24T10:45:00Z 858 
# 2 2017-11-24T11:45:00Z 858 

dfList$xyz 
#     ISTUTC Out 
# 3 2017-11-24T10:45:00Z 870 
# 4 2017-11-24T11:45:00Z 870 
+0

Siehe aktualisierte Lösung. – Parfait

+0

Danke, funktioniert wie ein Juwel! –