2016-11-06 2 views
1

У меня есть XML-файл с узлами с тем же именем, и я не могу узнать, как выбрать данные, которые я хочу, чтобы создать фрейм данных. Я новичок в R и XML, и я не могу заставить его работать!разбор XML в R, когда несколько узлов с одинаковыми именами

Мой XML выглядит следующим образом (только начало):

<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> 

код содержит различные узлы с именем «TimeSeries» с тем же типом данных (здесь Период не разработана для того, чтобы увидеть всю структуру)

<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> 

Я хочу, чтобы получить данные в следующем формате:

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

Я попытался применить решения, упомянутые в этом сообщении: How to parse XML to R data frame Но безуспешно. Мой код выглядит так, но я в результате dataframe не содержит данных:

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"))) 

Большое вам спасибо за вашу помощь!

+0

Итак, в конце концов, это то, что я сделал: 'XML. fileexp <- "https://website.com" xml.urlexp <-getURL (xml.fileexp) док <-xmlParse (xml.urlexp) DF <- ldply (xmlToList (док), data.frame) dfexp <-df [df $ .id == "TimeSeries",] ' – Daldal

+0

Ок, извините, я должен прокомментировать два раза .. не осталось времени для редактирования! Затем у меня был блок данных с каждой вещью внутри моих узлов, перечисленных в списке (в строках). Поскольку время начала и остановки дано, я мог бы написать код, учитывающий количество позиций в интервале. Вероятно, это не самое умное решение, но оно работает! – Daldal

ответ

0

Я думаю, вы могли бы найти то, что вам нужно здесь: How to transform XML data into a data.frame?

Это xmlToList() выглядит примерно правильно. Затем вы можете получить его в кадре данных, используя один из методов apply. Существует объяснение grea по вышеуказанной ссылке!

0

Рассмотрите возможность использования XML-данных xpathSApply() для запуска прямых выражений XPath. Для значения по psrType, используйте ancestor::* который data.frame() переводящие одно значения <TimeSeries> для каждых соответствующих значений периода и количества:

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 
Смежные вопросы