2014-07-28 3 views
1

На основании this Ответ Dirk Eddelbuettel Я пытаюсь прочитать файл xml из архива zip для дальнейшей обработки. Помимо URL и имен файлов, единственное изменение в указанном коде - это то, что я изменил read.table на xmlInternalTreeParse.Использование R для загрузки и чтения zipped-файла xml

library(XML) 
temp <- tempfile() 
download.file("http://epp.eurostat.ec.europa.eu/NavTree_prod/everybody/BulkDownloadListing?sort=1&downfile=data%2Fnrg_105a.sdmx.zip",temp) 
doc <- xmlInternalTreeParse(unz(temp, "nrg_105a.dsd.xml")) 
fileunlink(temp) 
closeAllConnections() 

Однако это возвращает следующее сообщение об ошибке:

Error in file.exists(file) : invalid 'file' argument 

traceback() показывает, что это вызов функции внутри синтаксического анализатора. Таким образом, temp, похоже, является неприемлемой ссылкой в ​​этом контексте. Есть ли способ сделать эту работу?

+0

'xmlInternalTreeParse' не кажется, работают точно так же, как' read.table'. В то время как 'read.table' может принимать объект соединения,' xmlInternalTreeParse' требует имя файла (как символ) в соответствии с документацией. – MrFlick

+0

Хмм, я никогда не понимал, что такое связь. Поэтому мне, вероятно, нужно преобразовать соединение в вектор символов с 'readLines' или что-то подобное. – Tungurahua

ответ

0

Вы можете попробовать:

# Make a temporary file (tf) and a temporary folder (tdir) 
tf <- tempfile(tmpdir = tdir <- tempdir()) 

## Download the zip file 
download.file("http://epp.eurostat.ec.europa.eu/NavTree_prod/everybody/BulkDownloadListing?sort=1&downfile=data%2Fnrg_105a.sdmx.zip", tf) 

## Unzip it in the temp folder 
xml_files <- unzip(tf, exdir = tdir) 

## Parse the first file 
doc <- xmlInternalTreeParse(xml_files[1]) 

## Delete temporary files 
unlink(tdir, T, T) 
+0

Отлично. При ближайшем рассмотрении я обнаружил, что оба кода делают практически то же самое, но ваш использует 'unzip' вместо' unz'. Использование первого позволяет запустить исходный скрипт. – Tungurahua

+1

Проблема в том, что 'xmlInternalTreeParse' требует имя файла, а не соединение (что' unz' возвращает). Да, вы правы, но он сохраняет извлеченный xml в вашем текущем каталоге. – alko989

Смежные вопросы