根据XMLSchema.xsd验证XML模式

时间:2014-09-02 12:10:45

标签: java xml xsd xerces

我正在尝试针对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)文档的根元素不是&lt; xsd:schema&gt;。

但是,当我在DOCTYPE文件中注释掉整个XMLSchema.XSD部分时,它正在运行。

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

所以我有两个问题:

  1. 为什么解析器无法处理XMLSchema.xsd XML序言?有没有办法解决这个问题,而无需编辑XMLSchema.xsd文件?
  2. 如果没有办法#1,如何在没有XML序言的情况下从http://www.w3.org/2001/XMLSchema.xsd下载XMLSchema.xsd文件,因此我不必手动编辑。一个简单的wget也会获取XML序言(当使用浏览器访问链接时,BTW不会出现。)
  3. 这实在是太大了,无法提供SSCCE,但如果有人想看看,我将提供一个带测试用例的github存储库。

1 个答案:

答案 0 :(得分:1)

如果它没有引用XMLSchema.dtd,那么一个明显的解决方案(除了注释掉你已经找到的DOCTYPE声明)将是下载DTD文件(XMLSchema。 dtd和datatypes.dtd)并在本地提供它们。