我正在尝试针对XMLSchema.xsd验证最简单的XSD文件:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a" type="xs:int"/>
</xs:schema>


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

但是,此操作失败:


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


它似乎与先前的消息(由我的自定义LSResourceResolver子类发出)有关:


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


但是,当我注释掉DOCTYPE文件中的整个XMLSchema.XSD部分时,它就起作用了。

我想这意味着解析器无法处理DOCTYPE中的ATTLISTXMLSchema.xsd子句。

所以我有两个问题:


解析器为什么无法处理XMLSchema.xsd XML序言?并且有什么方法可以解决此问题而无需编辑XMLSchema.xsd文件?
如果#1周围没有办法,如何在没有XML序言的情况下从http://www.w3.org/2001/XMLSchema.xsd下载XMLSchema.xsd文件,所以我不必手动进行编辑。一个简单的wget也会获取XML序言(使用浏览器访问该链接时不会显示BTW)。


这确实太大了,无法提供SSCCE,但是如果有人想看看,我将提供带有测试用例的github存储库。

最佳答案

如果对XMLSchema.dtd的引用失败,那么一个显而易见的解决方案(除了注释掉已经找到的DOCTYPE声明之外)将是下载DTD文件(XMLSchema.dtd和datatypes.dtd)并提供它们本地也是如此。

08-25 14:03