【问题标题】:How to allow for different XSD versions to be validated properly?如何允许正确验证不同的 XSD 版本?
【发布时间】: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


    【解决方案1】:

    所以,事实证明我尝试过的方法确实有效——我们不小心使用了无效的 xml!有效的方法(对于其他感兴趣的人)如下:

    List<InputSource> inputs = new ArrayList<InputSource>();
    inputs.add(new InputSource(getClass().getResourceAsStream("/schema/my-xsd-1.0.xsd")));
    inputs.add(new InputSource(getClass().getResourceAsStream("/schema/my-xsd-1.1.xsd")));
    
    xmlReader.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", 
        inputs.toArray(new InputSource[inputs.size()]));
    

    【讨论】:

      【解决方案2】:

      我个人认为,在对架构进行版本化时更改命名空间通常是个坏主意,除非更改是激进的 - 但对此看法不同,而且您似乎已经做出了决定,您不妨从中获益.

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

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

      【讨论】:

      • 所以建议不要更改命名空间,而是保持相同的命名空间并只更改版本号?那么如何将正确的版本传递给验证器呢?
      • 我也应该澄清一下——我不同意你对命名空间更改的看法——我继承了这一点。我可以改变它,这样命名空间就不会改变,我只是想弄清楚如何适当地处理不同 xsds 的查找。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2014-06-18
      • 2019-04-18
      • 2013-05-21
      相关资源
      最近更新 更多