【发布时间】:2011-06-08 14:43:00
【问题描述】:
我正在尝试更新一些 xml 解析器,但遇到了一个小问题。我们有一个 xsd,我们需要与旧版本的 xml 保持兼容,我们必须对其进行一些更改。我们在 xsd 的新版本中进行了更改,并且我们希望使用相同的解析器(因为更改通常非常小,并且解析器可以轻松处理两者)。我们正在使用XMLReader 属性"http://java.sun.com/xml/jaxp/properties/schemaSource" 将架构设置为以前的版本,使用类似以下内容:
xmlReader.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource",
new InputSource(getClass().getResourceAsStream("/schema/my-xsd-1.0.xsd")));
当我们只有一个版本的架构时,这很好用。现在我们有了一个新版本,我们希望系统使用传入 xml 中定义的架构的任何版本。两种模式都定义了一个命名空间,如下所示:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mycompany.com/my-xsd-1.0"
xmlns="http://www.mycompany.com/my-xsd-1.0"
elementFormDefault="unqualified" attributeFormDefault="unqualified">
对于新的:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mycompany.com/my-xsd-1.1"
xmlns="http://www.mycompany.com/my-xsd-1.1"
elementFormDefault="unqualified" attributeFormDefault="unqualified">
因此,它们定义了不同的命名空间和不同的架构“位置”。我们不希望模式存在于网络上——我们希望它与我们的系统捆绑在一起。有没有办法使用 setProperty 机制来执行此行为,或者是否有其他方法来处理此问题?
我尝试将这两个资源作为参数放入数组中的输入流中,但这不起作用(我记得在某处读到这是一个可能的解决方案 - 尽管现在我找不到源,所以它可能一厢情愿)。
【问题讨论】:
标签: java xml sax xml-validation