xml架构并使用选项作为文档根

时间:2009-10-28 18:38:43

标签: xml xsd

我有一些新手xml架构问题。我相信答案是我需要做的是模式不可能,但我想确定。问题是我有一个web服务,它在成功时返回一种类型的根元素的响应(比如< Response>),并且在完全失败时,返回一个具有不同根元素的文档(例如,< Exception>) 。所以,基本上,两个完全不同的文件:

<响应> ......< /响应>或
<例外> ....< /异常>

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

3 个答案:

答案 0 :(得分:34)

实际上,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>

答案 1 :(得分:1)

我遇到过这篇文章,我认为值得一提的是我从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服务框架可能无法理解是否&lt; foo&gt;或者&lt; bar&gt;是服务的请求根元素。

请参阅此链接 - Data Contract

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

答案 2 :(得分:-1)

这是不可能的,但替代方案并不是那么糟糕。只需声明一个键入的根节点作为选择,让您的应用程序返回一个带有“成功”或“异常”子节点的“响应”节点。如果您无法更改应用程序,那么您运气不好,但是通过这么简单的响应,您无法创建两个不同的模式,读取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>