读取xml文件时获取java异常错误
我试图读入为IAM数据库提供的xml文件,以便构建数据库。我正在使用Matlab在中读取这些文件,并且正在使用读取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
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验证失败,FEXxml2struct
就不会正确处理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。我已经发布了代码来删除所有
条目