2016-06-24 5 views
1

Я пытаюсь прочитать в XML-файле, предоставленном для базы данных IAM, чтобы структурировать базу данных. Я использую Matlab для чтения этих файлов и использую xmlread.Получение ошибки исключения java при чтении xml-файла

XML-файлы являются более чем 1500, и почти все они дают ту же ошибку:

Java exception occurred: 
java.io.FileNotFoundException: http://www.fki.inf.unibe.ch/iamdb/form-metadata.dtd 

    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source) 

    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 

    at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) 

Вот один из XML-файлов, я пытаюсь читать: http://pastebin.com/TtQz4ZCV

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

Является ли мой единственный вариант теперь вручную удалить эту строку из всех xml-файлов? или есть легкое исправление, чтобы прочитать это?

ответ

2

Вам необходимо отключить внешнюю загрузку DTD для анализатора. Для этого вы можете создать пользовательский объект DocumentBuilder, disable the external DTD loading и передать это как второй вход для xmlread.

Из скрытой xmlread документации (видны, если открыть файл с edit xmlread):

% Advanced use: 
% Note that FILENAME can also be an InputSource, File, or InputStream object 
% DOMNODE = XMLREAD(FILENAME,...,P,...) where P is a DocumentBuilder object 
% DOMNODE = XMLREAD(FILENAME,...,'-validating',...) will create a validating 
%    parser if one was not provided. 
% DOMNODE = XMLREAD(FILENAME,...,ER,...) where ER is an EntityResolver will 
%    will set the EntityResolver before parsing 
% DOMNODE = XMLREAD(FILENAME,...,EH,...) where EH is an ErrorHandler will 
%    will set the ErrorHandler before parsing 
% [DOMNODE,P] = XMLREAD(FILENAME,...) will return a parser suitable for passing 
%    back to XMLREAD for future parses. 
% 

Так что это заканчивает тем, что ищет что-то вроде этого:

% Create the DocumentBuilder 
builder = javax.xml.parsers.DocumentBuilderFactory.newInstance; 

% Disable validation 
builder.setFeature('http://apache.org/xml/features/nonvalidating/load-external-dtd', false); 

% Read your file 
xml = xmlread(filename, builder); 

Имейте в виду, что это может потенциально может привести к неправильному анализу вашего файла.

Update

Так смотрю на это чуть ближе, как только мы получим мимо проверки провала попытки DTD, то FEX xml2struct не обрабатывает DOCTYPE записи в XML правильно и пытается обработать его так же, как нормальный узел. Вы можете изменить источник xml2struct обнаружить это внутри:

if node.getNodeType == node.DOCUMENT_TYPE_NODE 

Однако, вероятно, было бы проще просто удалить все DOCTYPE с для всех ваших файлов XML. Следующий сценарий должен быть в состоянии сделать это.

folder = 'directory/where/all/files/live'; 

files = dir(fullfile(folder, '*.xml')); 

for k = 1:numel(files) 
    filename = fullfile(folder, files(k).name); 
    fid = fopen(filename, 'rt'); 
    content = fread(fid, '*char')'; 
    fclose(fid); 

    newcontent = regexprep(content, '\n\s*?<!DOCTYPE.*?(?=\n)', ''); 

    fout = fopen(filename, 'wt'); 
    fwrite(fout, newcontent); 
    fclose(fout); 
end 
+0

Спасибо, теперь открывается файл. Но я получаю еще одну ошибку, получая данные от одного из дочерних узлов. Я использую '' getNodeData''. Это дает ошибку '' Undefined function toCharArray 'для входных аргументов типа' double '.' Но когда я редактирую свой XML-файл и удаляю ссылку dtd в строке 3. И не использую конструктор, я могу открыть файл и получить данные из XML-файла. Вы упомянули, что строитель может неправильно проанализировать мой файл. Это причина ошибки? – StuckInPhD

+1

@StuckInPhD Я изучу его. Но тем временем вы можете удалить эту строку из * одного * файла, загрузить ее и сохранить второй вывод 'P' выше. Затем передайте это вместо 'builder', чтобы попытаться прочитать другой файл – Suever

+0

Спасибо за быстрый ответ. Я снова получаю исходную ошибку исключения Java. Я прочитал в отредактированном xml-файле второй вывод '' p'', а затем использовал '' p'' вместо '' builder'' в качестве второго аргумента при чтении в неотредактированном XML-файле. – StuckInPhD

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