Получить данные bibtex из перекрестной ссылки, отправив DOI из matlab: перевод из ruby
Я хочу получить данные bibtex (для создания библиографии), отправив DOI (идентификатор цифрового объекта) на http://www.crossref.org/ из matlab.
API перекрестной ссылки предлагает что-то вроде этого:
curl -LH "Accept: text/bibliography; style=bibtex" http://dx.doi.org/10.1038/nrd842
на основании этого источника.
Другой пример здесь предлагает следующее в ruby
:
open("http://dx.doi.org/10.1038/nrd842","Accept" => "text/bibliography; style=bibtex"){|f| f.each {|line| print line}}
Хотя я слышал рубиновые камни, я хочу сделать это в Matlab и не знаю, как перевести сообщение ruby или интерпретировать команду crossref.
Вот то, что я до сих пор отправлял doi для перекрестной ссылки и извлечения данных в xml (в переменной retdat
), но не bibtex, формат:
clear
clc
doi = '10.1038/nrd842';
URL_PATTERN = 'http://dx.doi.org/%s';
fetchurl = sprintf(URL_PATTERN,doi);
numinputs = 1;
www = java.net.URL(fetchurl);
is = www.openStream;
%Read stream of data
isr = java.io.InputStreamReader(is);
br = java.io.BufferedReader(isr);
%Parse return data
retdat = [];
next_line = toCharArray(br.readLine)'; %First line contains headings, determine length
%Loop through data
while ischar(next_line)
retdat = [retdat, 13, next_line];
tmp = br.readLine;
try
next_line = toCharArray(tmp)';
if strcmp(next_line,'M END')
next_line = [];
break
end
catch
break;
end
end
%Cleanup java objects
br.close;
isr.close;
is.close;
Будем весьма благодарны за помощь в переводе оператора ruby во что-то, что matlab может отправить, используя скрипт, такой как тот, который был опубликован для установления связи с crossref.
Редактировать:
Дополнительные ограничения включают обратную совместимость кода (по крайней мере, до R14):>(. Кроме того, не использовать ruby, так как это решает проблему, но не является решением "matlab", смотрите здесь, чтобы узнать, как вызывать ruby из matlab через system('ruby script.rb')
,
2 ответа
Ответ от пользователя 2034006 прокладывает путь к решению. Следующий скрипт работает, когда urlread
модифицируется:
URL_PATTERN = 'http://dx.doi.org/%s';
doi = '10.1038/nrd842';
fetchurl = sprintf(URL_PATTERN,doi);
method = 'post';
params= {};
[string,status] = urlread(fetchurl,method,params);
Модификация в urlread
не совпадает с предложением пользователя 2034006. Все работало, когда линия
urlConnection.setRequestProperty('Content-Type','application/x-www-form-urlencoded');
в urlread
был заменен на
urlConnection.setRequestProperty('Accept','text/bibliography; style=bibtex');
Вы можете легко редактировать urlread для того, что вам нужно. Я не буду публиковать мой модифицированный код функции urlread из-за авторских прав.
В urlread (у меня это C:\Program Files\MATLAB\R2012a\toolbox\matlab\iofun\urlread.m), как наименее элегантное решение:
Прямо перед "% Чтение данных из соединения." Я добавил:
urlConnection.setRequestProperty('Accept','text/bibliography; style=bibtex');