【问题标题】:Error parsing XML using certain schema with Java使用 Java 使用特定模式解析 XML 时出错
【发布时间】: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 的建议添加&lt;!DOCTYPE COLLADA&gt;,结果抛出异常:

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 正在解决您在添加 &lt;!DOCTYPE COLLADA&gt; 行时收到的错误。您可能在 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".

标签: java xml xsd schema


【解决方案1】:

您需要将 DocumentBuilder 声明为可识别名称空间。 (你真的需要使用 DOM 吗?)

除非您想要 DTD 验证(不同于模式验证),否则不应使用 setValidating() 声明它。

【讨论】:

  • Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 2; columnNumber: 9; Document is invalid: no grammar found.
  • 添加到答案中。除非有 DTD,否则您不想调用 setValidating(true)。
【解决方案2】:

未找到 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">
...

【讨论】:

  • Error: org.xml.sax.SAXParseException; systemId: file:/home/.../cube.dae; lineNumber: 6; columnNumber: 26; Document root element "COLLADA", must match DOCTYPE root "null".
  • 我在测试 if 之前删除了它。
猜你喜欢
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2016-06-12
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多