Вам необходимо отключить внешнюю загрузку 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
Спасибо, теперь открывается файл. Но я получаю еще одну ошибку, получая данные от одного из дочерних узлов. Я использую '' getNodeData''. Это дает ошибку '' Undefined function toCharArray 'для входных аргументов типа' double '.' Но когда я редактирую свой XML-файл и удаляю ссылку dtd в строке 3. И не использую конструктор, я могу открыть файл и получить данные из XML-файла. Вы упомянули, что строитель может неправильно проанализировать мой файл. Это причина ошибки? – StuckInPhD
@StuckInPhD Я изучу его. Но тем временем вы можете удалить эту строку из * одного * файла, загрузить ее и сохранить второй вывод 'P' выше. Затем передайте это вместо 'builder', чтобы попытаться прочитать другой файл – Suever
Спасибо за быстрый ответ. Я снова получаю исходную ошибку исключения Java. Я прочитал в отредактированном xml-файле второй вывод '' p'', а затем использовал '' p'' вместо '' builder'' в качестве второго аргумента при чтении в неотредактированном XML-файле. – StuckInPhD