【发布时间】:2015-03-28 02:28:24
【问题描述】:
我正在尝试使用this schema 解析一个文件(我确信该文件在语法上是正确的,它是生成的)。文件开头是这样的:
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
...
这是我的加载代码:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setValidating(true);
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL schemaURL = new URL("http://www.khronos.org/files/collada_schema_1_4");
Schema schema = sf.newSchema(schemaURL);
dbFactory.setSchema(schema);
DocumentBuilder docBuilder = dbFactory.newDocumentBuilder();
docBuilder.setErrorHandler(new ErrorHandler() {
@Override
public void warning(SAXParseException e) throws SAXException {
System.err.print("Warning: ");
e.printStackTrace();
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
System.err.print("FATAL ERROR: ");
e.printStackTrace();
}
@Override
public void error(SAXParseException e) throws SAXException {
System.err.print("Error: ");
e.printStackTrace();
}
});
Document doc = docBuilder.parse(file); //Line throwing error
这样解析会引发以下错误:
Error: org.xml.sax.SAXParseException; systemId: file:/home/ukraine/Desktop/Code/Java/Eclipse/3D%20Previewer/models/cube.dae; lineNumber: 2; columnNumber: 79; Element type "COLLADA" must be declared.
at ...
Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 2; columnNumber: 79; cvc-elt.1: Cannot find the declaration of element 'COLLADA'.
at ...
Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 3; columnNumber: 9; Element type "asset" must be declared.
at ...
尽管我相当确定这个语法是正确的,但我还是尝试按照this question 的建议添加<!DOCTYPE COLLADA>,结果抛出异常:
FATAL ERROR: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 2; columnNumber: 6; The processing instruction target matching "[xX][mM][lL]" is not allowed.
编辑:这些是迄今为止我从建议中得到的错误:
将DocumentBuilder 设置为命名空间感知时:
Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 2; columnNumber: 9; Document is invalid: no grammar found.
添加xsi:schemaLocation时:
Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 6; columnNumber: 26; Document root element "COLLADA", must match DOCTYPE root "null".
【问题讨论】:
-
XML prolog 之前的文件前面有垃圾。也许有一个 BOM,而您使用的是非常旧的 Java 版本?
-
@bmargulies 我使用的是 java 7。我不确定你指的是哪个文件以及垃圾是什么。
-
@bmargulies 正在解决您在添加
<!DOCTYPE COLLADA>行时收到的错误。您可能在 XML 声明之前添加了它,并且在 XML 声明之前不会出现任何内容。无论如何,您不需要 DOCTYPE 行。真正的问题(由Element type "COLLADA" must be declared. at ...表示)是找不到您的XSD。您可以使用xsi:schemaLocation,正如我在answer below 中展示的那样,提示XML 解析器在哪里可以找到XSD。 -
@kjhughes 这对我不起作用。我收到了这个错误:
Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 6; columnNumber: 26; Document root element "COLLADA", must match DOCTYPE root "null".