读取xml文件时获取java异常错误

读取xml文件时获取java异常错误,xml,matlab,xml-parsing,Xml,Matlab,Xml Parsing,我试图读入为IAM数据库提供的xml文件,以便构建数据库。我正在使用Matlab在中读取这些文件,并且正在使用xmlread xml文件远远超过1500个,几乎所有这些文件都给出了相同的错误: Java exception occurred: java.io.FileNotFoundException: http://www.fki.inf.unibe.ch/iamdb/form-metadata.dtd at sun.net.www.protocol.http.HttpURLConn

我试图读入为IAM数据库提供的xml文件,以便构建数据库。我正在使用Matlab在中读取这些文件,并且正在使用
xmlread

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文件:

顶部的“未找到”链接指向404页面,因此该页面已不存在,他们忘记修复它


我现在唯一的选择是从所有xml文件中手动删除这一行吗?或者,有没有一个简单的修复方法可以读取此内容?

您需要禁用解析器的外部DTD加载。要实现这一点,您可以创建一个自定义对象,并将其作为第二个输入传递给
xmlread

从隐藏的
xmlread
文档(如果使用
edit xmlread
打开文件,则可见):

%高级使用:
%请注意,文件名也可以是InputSource、File或InputStream对象
%DOMNODE=XMLREAD(FILENAME,…,P,…),其中P是DocumentBuilder对象
%DOMNODE=XMLREAD(文件名,…,-validating,…)将创建一个验证
%如果未提供语法分析器,则使用语法分析器。
%DOMNODE=XMLREAD(FILENAME,…,ER,…),其中ER是一个EntityResolver
%将在解析之前设置EntityResolver
%DOMNODE=XMLREAD(FILENAME,…,EH,…),其中EH是一个ErrorHandler
%将在解析之前设置ErrorHandler
%[DOMNODE,P]=XMLREAD(FILENAME,…)将返回适合传递的解析器
%返回XMLREAD,以便将来进行解析。
%   
所以这看起来像这样:

%创建DocumentBuilder
builder=javax.xml.parsers.DocumentBuilderFactory.newInstance;
%禁用验证
builder.setFeature('http://apache.org/xml/features/nonvalidating/load-external-dtd",假),;
%阅读你的文件
xml=xmlread(文件名,生成器);
请记住,这可能会导致文件被错误解析

更新

因此,仔细研究一下,一旦我们通过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
folder='directory/where/all/files/live';
files=dir(fullfile(文件夹“*.xml”);
对于k=1:numel(文件)
filename=fullfile(文件夹,文件(k).name);
fid=fopen(文件名为“rt”);
内容=fread(fid,“*char”);
fclose(fid);

newcontent=regexprep(内容,'\n\s*?谢谢,现在打开该文件。但从其中一个子节点获取数据时,我遇到另一个错误。我使用的是
getNodeData
。对于类型为“double”的输入参数,这会导致
未定义函数“toCharArray”的错误。
但当我编辑xml文件并删除第3行的dtd链接时,请不要使用生成器我可以打开文件并从xml文件中获取数据。您确实提到了生成器可能会错误地解析我的文件。这就是错误的原因吗?@StuckInPhD我会研究一下。但在此期间,您可以做的是从一个文件中删除该行,加载它并存储上面的第二个输出
P
。然后将此信息传递给我n代替
builder
尝试读取另一个文件感谢您的快速响应。我现在再次收到初始java异常错误。我用第二个输出
p
读入已编辑的xml文件,然后在读取未编辑的xml文件时使用
p
代替
builder
作为第二个参数。@卡住了InPhD你能链接到你试图运行的实际代码吗?@StuckInPhD发现这是
xml2struct
中的一个bug。我已经发布了代码来删除所有
条目