使用带有 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 验证(与模式验证不同)。
我正在尝试使用 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 验证(与模式验证不同)。