パーサーの外部DTDロードを無効にする必要があります。これを実現するには、カスタムDocumentBuilder
オブジェクト(disable the external DTD loading)を作成し、これをxmlread
の2番目の入力として渡すことができます。隠された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);
をは、ファイルが誤って解析される可能性があります。
更新
は、だから我々は、DTD検証の失敗を乗り越えると、FEX xml2struct
が正しくXMLでDOCTYPE
エントリを処理し、同じようにそれを処理しようとしません、もう少し近くにこの覗きますノーマルノード。あなたは、内部的にこれを検出するためにxml2struct
のソースを変更できます。
if node.getNodeType == node.DOCUMENT_TYPE_NODE
しかし、おそらくちょうどあなたのXMLファイルのすべてのためにすべてのDOCTYPE
Sを除去するのに容易になるだろう。次のスクリプトはこれを行うことができるはずです。
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
ありがとうございます、これでファイルが開きます。しかし、子ノードの1つからデータを取得する際に別のエラーが発生します。私は '' getNodeData''を使っています。これは、 ''未定義関数 'toCharArray'に 'double'型の入力引数のエラーを与えます.''しかし、xmlファイルを編集して3行目のdtdリンクを削除すると、ビルダーは使用できません。 XMLファイルからデータを取得します。あなたはビルダーが私のファイルを間違って解析するかもしれないと言及しました。それがエラーの理由ですか? – StuckInPhD
@ StuckInPhD私はそれを調べます。しかし、その間に* one *ファイルからその行を削除し、それをロードして上の2番目の出力 'P'を保存することができます。 'builder'の代わりにこれを渡して、別のファイルを読み込もうとします。 – Suever
素早い応答をありがとう。私は今、再び最初のJava例外エラーを取得しています。編集されたxmlファイルを第2の出力 '' p''で読み取った後、第2引数として '' builder''の代わりに '' p''を使って、未編集のxmlファイルを読み込みます。 – StuckInPhD