gpt4 book ai didi

java - 如何允许正确验证不同的 XSD 版本?

转载 作者:行者123 更新时间:2023-12-04 06:23:38 26 4
gpt4 key购买 nike

我正在尝试更新一些 xml 解析器,但遇到了一个小问题。我们有一个 xsd,我们需要与旧版本的 xml 保持兼容,我们必须对其进行一些更改。我们在新版本的 xsd 中进行了更改,我们希望使用相同的解析器(因为更改通常很小,解析器可以轻松处理两者)。我们正在使用 XMLReader属性(property)"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 机制来做这个行为,或者有没有不同的方法来处理这个问题?

我尝试将两个资源放在一个数组中的输入流中作为参数,但这不起作用(我记得在某处读到这是一个可能的解决方案 - 虽然现在我找不到源,所以它可能是一厢情愿的思维)。

最佳答案

就我个人而言,我认为在对模式进行版本控制时更改命名空间通常是一个坏主意,除非更改是根本性的 - 但对此看法不同,而且您似乎已经做出了决定,您也可以从中受益。

由于您使用的是两个不同的命名空间,因此模式可能是不相交的,因此您应该能够为处理器提供一个模式,该模式是两者的结合 - 我不知道是否有更好的方法,但有一种方法可以实现这一点是编写一个导入两者的小 stub 架构,并将此 stub 作为您的 schemaSource 属性提供。处理器将使用与源文档中元素的命名空间匹配的任何模式声明。

(使用特定于版本的命名空间使这项任务 - 验证 - 更容易。但它使 XML 的后续处理(例如使用 XPath)变得更难,因为很难编写适用于这两个命名空间的代码。)

关于java - 如何允许正确验证不同的 XSD 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6280626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com