使用带有 Java 的特定模式解析 XML 时出错

Error parsing XML using certain schema with Java

我正在尝试使用 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".

未找到 XSD。 在 XML 实例与其管理 XSD 之间建立关联的一种方法是通过xsi:schemaLocation:

<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.collada.org/2005/11/COLLADASchema
                             https://www.khronos.org/files/collada_schema_1_4"
         version="1.4.1">
...

您需要将 DocumentBuilder 声明为命名空间感知型。 (你真的需要使用 DOM 吗?)

并且你不应该用 setValidating() 声明它,除非你想要 DTD 验证(与模式验证不同)。