我正在尝试针对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
中的ATTLIST
和XMLSchema.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)并提供它们本地也是如此。