【问题标题】:xml schema and using a choice as the document rootxml 架构并使用选项作为文档根
【发布时间】:2011-01-17 10:04:41
【问题描述】:

我有一个新手 xml 架构问题。我相信答案是模式无法实现我需要做的事情,但我想确定一下。问题是我有一个 web 服务,它在成功时返回具有一种根元素类型的响应(例如 ),而在完全失败时返回具有不同根元素(例如 )的文档。所以,基本上,两个完全不同的文件:

......响应> 或
....异常>

是否可以用 一个 模式文档来描述这两个不同的文档?这就像我想要一个选择作为架构元素下的第一个元素——但这不是有效的语法。我尝试了几个解析为有效 xsd 的变体,但不验证文档。有什么建议么?或者这根本不可能?非常感谢 - m

【问题讨论】:

标签: xml xsd


【解决方案1】:

实际上,XML 模式确实允许您在单个模式中定义替代根元素,尽管不能使用choice 元素。相反,您需要做的就是将每个可能的根列为您的 schema 元素的直接子级。

例如,给定以下 XML 架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="foo">
        ...
    </xs:element>
    <xs:element name="bar">
        ...
    </xs:element>
</xs:schema>

以下任何一个文件都可以对其进行验证:

<foo>
    ...
</foo>

或者:

<bar>
    ...
</bar>

【讨论】:

  • 天啊——这应该是显而易见的。谢谢!
  • 这可能是一个很好的解决方案,其中几个根节点共享许多相同的结构。我看到的唯一缺点是可能需要进行初始检查以确保根节点是预期的。
  • 有时我们认为太复杂而解决方案如此简单
【解决方案2】:

我偶然发现了这篇文章,我认为值得一提的是我从 Spring Web Services 世界(那些首先重视数据契约的世界)中得出的结论。

解决这个根元素问题的一个好方法是直接在模式元素下定义多个根元素,就像 Phil Booth 提到的那样。

但是,当谈到优先考虑数据的最佳实践和 Web 服务框架时,万无一失的架构设计很重要。当有人定义这样的模式时 -

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">   
<xs:element name="foo">   
    ...   
</xs:element>   
<xs:element name="bar">   
    ...   
</xs:element>   

像 Spring-WS 这样的 web 服务框架,它依赖于这种所谓的数据契约模式来生成 web 服务,可能无法理解 是否是服务的请求根元素。

请参考此链接 - Data Contract

在这种情况下,我发现“John at CashCommons”或 Stephen Rushing 给出的方法很有用。

【讨论】:

    【解决方案3】:

    这是不可能的,但替代方案还不错。只需声明一个作为选择类型的根节点,并让您的应用程序返回一个带有“成功”或“异常”子节点的“响应”节点。如果你不能改变应用程序,那么你就不走运了,但是这么简单的响应,你不能创建两个不同的模式,读取 firstChild 节点,然后应用相关的模式吗?

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
       <xs:element name="Response">
        <xs:complexType>
            <xs:choice>
                <xs:element name="Success"/>
                <xs:element name="Exception"/>
            </xs:choice>
        </xs:complexType> 
       </xs:element>
    </xs:schema>
    

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多