验证时的DTD信息和相关错误(XSD架构) - 是否可以忽略它们?

bob*_*205 2 xml schema xsd saxparser saxparseexception

所以我有大量的XML文件.多年来,他们造成了麻烦,因为写这些人的人手工完成,所以错误自然而然地发生了.我们现在应该验证它们并在尝试使用这些XML文件时提供有关错误的反馈.

我正在使用SAX解析器并获取错误列表.

以下是我的代码

  BookValidationErrorHandler errorHandler = new BookValidationErrorHandler();

        SAXParserFactory factory = SAXParserFactory.newInstance();
        factory.setValidating(true);
        factory.setNamespaceAware(true);

        SchemaFactory schemaFactory = 
            SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

        factory.setSchema(schemaFactory.newSchema(
            new Source[] {new StreamSource("test.xsd")}));


        javax.xml.parsers.SAXParser parser = factory.newSAXParser();
        org.xml.sax.XMLReader reader = parser.getXMLReader();

        reader.setErrorHandler(errorHandler);
        reader.parse(new InputSource("bad.xml"));
Run Code Online (Sandbox Code Playgroud)

前几个错误始终是:

行号:2:文档无效:未找到语法.行号:2:文档根元素"信用",必须与DOCTYPE根"null"匹配.

我们不可能去编辑需要检查的数千个XML文件.

有什么我可以轻松添加到源的前面以防止这种情况吗?有没有办法告诉解析器忽略这些与DTD相关的错误?甚至不确定语法是什么意思.我有点理解第二个意味着什么.

Mic*_*Kay 7

setValidating(true)如果不存在DTD,则设置请求DTD验证并导致失败.如果您只想要架构验证而不是DTD验证,那么请使用setValidating(false).来自JavadocsetValidating():

要使用现代模式语言(如W3C XML Schema或RELAX NG而不是DTD),可以通过将setValidating(boolean)方法保留为false 来将解析器配置为非验证解析器,然后使用该setSchema(Schema)方法将模式与解析器相关联.