Чтение файлов sdmx -xml в кадр данных в R

Мне было интересно, удалось ли кому-нибудь прочитать XML-файлы SDMX -в кадр данных. Файл, который я хотел бы прочитать, этоhttps://www.ecb.europa.eu/stats/sdmx/icpf/1/data/pension_funds.xml(1мб ). Я сохранил файл как «пенсии _funds.xml» в pwd и попытался использовать пакет XML для его чтения :

fileName <- system.file("pensions", "pensions_funds.xml", package="XML")
parsed<-xmlTreeParse("pension_funds.xml",getDTD=F)
r<-xmlRoot(parsed)
tmp = xmlSApply(r, function(x) xmlSApply(x, xmlValue))

. Несколько строк выше в основном следуют примеру здесьhttp://www.omegahat.org/RSXML/gettingStarted.html но я думаю, что мне сначала нужно как-то игнорировать заголовок (, который я вставил ниже первых нескольких страниц файла, который я пытаюсь прочитать ). Поэтому я думаю, что вышеизложенное может работать, но оно начинается с неправильного узла для моих целей. Я хотел бы получить значения obs _, проиндексированные по их периоду времени _и области ссылки _.

Первое, что нужно сделать, это найти правильный узел и начать с него, однако я подозреваю, что могу оказаться на дурацком задании, поскольку у меня ограниченные знания о форматах данных, и я не уверен, что пакет XML можно использовать для файлов SDMX -XML.. Кажется, более умные люди пытались это сделать.http://opensdmxdevelopers.wikispaces.com/RSDMX Я не могу найти этот пакет для загрузки на его домашней странице здесьhttps://r-forge.r-project.org/projects/rsdmx/ (Я не вижу ни одного раздела ссылки/загрузки, но, возможно, я слепой )и, похоже, это ранние стадии. Существование rsdmx предполагает, что использование пакета xml для чтения sdmx может быть непростым, поэтому я готов сдаться на этом этапе, если только кто-то не добился успеха в этом. На самом деле меня в основном интересует чтение этого файлаhttp://www.ecb.europa.eu/stats/sdmx/bsi/1/data/outstanding_amounts.xml Но это файл размером 10 МБ, поэтому я начал с меньшего размера.

редактировать3 попытка ответа sgibb на большой файл с использованием изменений в комментарии Миши библиотека ("XML")

url <- "http://www.ecb.europa.eu/stats/sdmx/bsi/1/data/outstanding_amounts.xml"

    sdmxHandler <- function() {
  ## data.frame which stores results
  data <- data.frame(stringsAsFactors=FALSE)
  ## counter to store current row
  i <- 1
  ## temp value to store current REF_AREA
  ## temp value to store current REF_AREA
  refArea <- NA
  bsItem <- NA
  bsCountSector <- NA

  ## handler subroutine for Obs tag
  Obs <- function(name, attr) {
    ## found an Obs tag and now fill data.frame
    data[i, "refArea"] <<- refArea
    data[i, "timePeriod"] <<- as.numeric(attr["TIME_PERIOD"])
    data[i, "obsValue"] <<- as.numeric(attr["OBS_VALUE"])
    data[i, "bsItem"] <<- bsItem
    data[i, "bsCountSector"] <<- bsCountSector
    i <<- i + 1
  }

  ## handler subroutine for Series tag
  Series <- function(name, attr) {
    refArea <<- attr["REF_AREA"]
    bsItem <<- as.character(attr["BS_ITEM"])
    bsCountSector <<- as.numeric(attr["BS_ITEM"])
  }
  return(list(getData=function() {return(data)},
              Obs=Obs, Series=Series))
}

## run parser
df <- xmlEventParse(file(url), handlers=sdmxHandler())$getData()
Specification mandate value for attribute OBS_VALUE
attributes construct error
Couldn't find end of Start Tag Obs line 15108
Premature end of data in tag Series line 15041
Premature end of data in tag DataSet line 91
Premature end of data in tag CompactData line 2
Error: 1: Specification mandate value for attribute OBS_VALUE
2: attributes construct error
3: Couldn't find end of Start Tag Obs line 15108
4: Premature end of data in tag Series line 15041
5: Premature end of data in tag DataSet line 91
6: Premature end of data in tag CompactData line 2
In addition: There were 50 or more warnings (use warnings() to see the first 50)

редактировать2: ответ от sgibb выглядит идеально и отлично работает с файлом меньшего размера. Я пытался запустить его на

url <- http://www.ecb.europa.eu/stats/sdmx/bsi/1/data/outstanding_amounts.xml

(файл 10mb, исходная ссылка исправлена ​​),с единственной модификацией, заключающейся в добавлении двух строк:

data[i, "bsItem"] <<- as.character(attr["BS_ITEM"])

data[i, "bsCountSector"] <<- as.numeric(attr["BS_COUNT_SECTOR"])

(это дополнительные переменные идентификатора, которые необходимы для идентификации строки в этом большом наборе данных ). Он работал несколько минут, а затем завершился с этой ошибкой:

Error: 1: Specification mandate value for attribute TIME_PE
2: attributes construct error
3: Couldn't find end of Start Tag Obs line 20743
4: Premature end of data in tag Series line 20689
5: Premature end of data in tag DataSet line 91 6: Premature end of data in tag CompactData line 2

Кроме того :было 50 или более предупреждений (используйте предупреждения (), чтобы увидеть первые 50)

Базовый формат данных кажется очень похожим, поэтому я подумал, что это может сработать. Основной формат файла размером 10 МБ приведен ниже :

    
        
        
        

. редактировать1:

желаемый формат данных:

Ref_area    time_period obs_value

At  2006    118    
At  2007    119    
…    
Be  2006    101    
…

Вот первый бит данных.

    
    DataSet xsi:schemaLocation="https://www.ecb.europa.eu/vocabulary/stats/icpf/1 https://www.ecb.europa.eu/stats/sdmx/icpf/1/structure/2011-08-11/sdmx-compact.xsd" xmlns="https://www.ecb.europa.eu/vocabulary/stats/icpf/1"> 

6
задан Christophe Roussy 3 November 2016 в 09:28
поделиться