Получить данные 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');
Другие вопросы по тегам