我有一些新手xml架构问题。我相信答案是我需要做的是模式不可能,但我想确定。问题是我有一个web服务,它在成功时返回一种类型的根元素的响应(比如< Response>),并且在完全失败时,返回一个具有不同根元素的文档(例如,< Exception>) 。所以,基本上,两个完全不同的文件:
<响应> ......< /响应>或
<例外> ....< /异常>
是否可以使用一个架构文档来描述这两个不同的文档?这就像我想要一个选择作为schema元素下的第一个元素 - 但这不是有效的语法。我尝试了几种解析为有效xsd的变体,但不验证文档。有什么建议?或者这根本不可能?非常感谢提前 - m
答案 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>