Java 根据XMLSchema.xsd验证XML架构
我正在尝试根据以下内容验证最简单的XSD文件: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”的声明 它似乎与以前的消息相关(由我的自定义
为此,我下载了文件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
文件的情况下解决这个问题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>