2016-06-24 32 views
1

データベースを構造化するために、IAMデータベース用のxmlファイルを読み込もうとしています。私はこれらのファイルを読むためにMatlabを使用しており、xmlreadを使用しています。xmlファイルの読み込み中にJava例外エラーが発生する

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ファイルの1つです:http://pastebin.com/TtQz4ZCV

ありません発見されたリンクは404ページにあるので、もはや存在せず、修正するのを忘れてしまった。

私の唯一の選択肢は、この行をすべてのXMLファイルから手動で削除することですか?またはこれを読むための簡単な修正はありますか?

答えて

2

パーサーの外部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 
+0

ありがとうございます、これでファイルが開きます。しかし、子ノードの1つからデータを取得する際に別のエラーが発生します。私は '' getNodeData''を使っています。これは、 ''未定義関数 'toCharArray'に 'double'型の入力引数のエラーを与えます.''しかし、xmlファイルを編集して3行目のdtdリンクを削除すると、ビルダーは使用できません。 XMLファイルからデータを取得します。あなたはビルダーが私のファイルを間違って解析するかもしれないと言及しました。それがエラーの理由ですか? – StuckInPhD

+1

@ StuckInPhD私はそれを調べます。しかし、その間に* one *ファイルからその行を削除し、それをロードして上の2番目の出力 'P'を保存することができます。 'builder'の代わりにこれを渡して、別のファイルを読み込もうとします。 – Suever

+0

素早い応答をありがとう。私は今、再び最初のJava例外エラーを取得しています。編集されたxmlファイルを第2の出力 '' p''で読み取った後、第2引数として '' builder''の代わりに '' p''を使って、未編集のxmlファイルを読み込みます。 – StuckInPhD

関連する問題