Java 根据XMLSchema.xsd验证XML架构

Java 根据XMLSchema.xsd验证XML架构,java,xml,xsd,xerces,Java,Xml,Xsd,Xerces,我正在尝试根据以下内容验证最简单的XSD文件: 为此,我下载了文件XMLSchema.xsd并将其传递给我的org.w3c.dom.ls.lsresourcesolver,以确保使用本地提供的XMLSchema.xsd,而不是通过Internet获取。代码在我的类路径上使用Saxon-HE-9.4.jar运行 但是,这在以下情况下失败: org.xml.sax.SAXParseException;cvc elt.1:找不到元素“xs:schema”的声明 它似乎与以前的消息相关(由我的自定义

我正在尝试根据以下内容验证最简单的XSD文件:


为此,我下载了文件XMLSchema.xsd并将其传递给我的
org.w3c.dom.ls.lsresourcesolver
,以确保使用本地提供的
XMLSchema.xsd
,而不是通过Internet获取。代码在我的类路径上使用
Saxon-HE-9.4.jar
运行

但是,这在以下情况下失败:

org.xml.sax.SAXParseException;cvc elt.1:找不到元素“xs:schema”的声明

它似乎与以前的消息相关(由我的自定义
lsresourcesolver
子类发出):

无法读取架构文档“[…]XMLSchema.xsd”,因为1)找不到该文档;2) 文件无法读取;3) 文档的根元素不是

然而,当我注释掉
XMLSchema.XSD
文件中的整个
DOCTYPE
部分时,它正在工作

我猜这意味着解析器无法处理
XMLSchema.xsd
中的
DOCTYPE
ATTLIST
子句

所以我有两个问题:

  • 为什么解析器无法处理
    XMLSchema.xsd
    xmlprolog?有没有办法在不编辑
    XMLSchema.xsd
    文件的情况下解决这个问题
  • 如果无法绕过#1,我如何从没有XML prolog的服务器下载
    XMLSchema.xsd
    文件,这样我就不必手动编辑。一个简单的
    wget
    也会获取XML序言(顺便说一句,当使用浏览器访问链接时,该序言不会出现)

  • 这实在太大了,无法提供SSCCE,但如果有人想看一看,我会提供一个github存储库和测试用例。

    如果对XMLSchema.dtd的引用失败,那么一个明显的解决方案(除了注释掉DOCTYPE声明,您已经找到了)就是下载dtd文件(XMLSchema.dtd和datatypes.dtd)也可以在本地提供它们。

    只是想知道:您使用的是DOM文档吗?如果是这样,在创建时您是否将validating设置为false,还是将其保留为默认值?@nablex是,该文件被读取为
    org.w3c.DOM.Document
    ;在
    DocumentBuilderFactory
    对象上,我调用:
    setValidating(false);
    您已经用“saxon”和“xerces”标记了这个问题。这两个都提供了模式验证器,但您没有明确说明您使用的是哪一个。我从错误消息中得到的印象是,您正在使用xerces模式验证器;那么您为什么要用“saxon”标记这个问题呢?@MichaelKay你是对的,我使用的
    验证器是类
    org.apache.xerces.jaxp.validation.ValidatorImpl
    。实际上我只是在做一个
    Validator Validator=schema.newValidator()
    由于我只将saxon作为依赖项引入,所以我假设使用了saxon验证器。显然,saxon将Xerces和Xalan作为可传递依赖项引入,因此Xerces验证器最终被使用。有没有办法更明确地控制创建哪个验证器?我已经删除了saxon标记。如果您想进行模式验证,请在通过JAXP接口使用Saxon时,您可以使用JAXP模式工厂接口,但不能通过在XML解析器上设置验证属性来实现,因为Saxon验证器没有与解析器集成,它是独立的。
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="a" type="xs:int"/>
    </xs:schema>