如何声明一个 complexType 只有一个子元素?
Posted
技术标签:
【中文标题】如何声明一个 complexType 只有一个子元素?【英文标题】:How to declare a complexType has only one child element? 【发布时间】:2013-10-13 22:10:13 【问题描述】:当使用 XML Schema 声明 complexType
只有一个子元素时,以下三种方法都可以达到目的:
<xs:complexType> <xs:sequence> <xs:element ref="somevalue"/> </xs:sequence> </xs:comlexType>
<xs:complexType> <xs:choice> <xs:element ref="somevalue"/> </xs:choice> </xs:comlexType>
<xs:complexType> <xs:all> <xs:element ref="somevalue"/> </xs:all> </xs:comlexType>
显然,sequence
、choice
和all
对于单个元素不是必需的,因为它们应该用于指示多个元素的顺序。 有没有更简洁的方法来声明一个只有一个子元素的complexType
?(即一种消除使用sequence
、all
或choice
的方法。)
【问题讨论】:
Early working drafts of the schema spec 如果您将element
声明直接嵌套在 complexType
中,则假定隐式 sequence
,但在规范达到其最终形式之前已将其删除,以支持始终要求显式 @ 987654334@、choice
或all
。
好的,我会选择顺序:)
【参考方案1】:
仅消除xs:sequence
、xs:choice
或xs:all
是不可行的:
<xs:complexType name="cType">
<xs:element name="e"/>
</xs:complexType>
无效。
参见XML Representation of Complex Type Definitions,其中complexType
的内容模型定义如下:
(注解?, (simpleContent | complexContent | ((group | all |选择 |序列)?,((属性|属性组)*, 任何属性?))))
没有规定element
是complexType
的直系子代。
【讨论】:
你的解释和网址让一切都清楚了,谢谢!所以看起来 XML Schema 没有提供一种紧凑的方式来声明单个元素 complexType,我必须始终将单个元素放入所有 |选择 |序列 |组。 你可以为所有 |选择 |序列 |组添加限制 maxOccurs = "1",这至少会将出现次数限制为一次: @DEX:maxOccurs
已经默认为1
。此外,对于只允许单个子元素的简单情况,OP 的问题是完全省略xs:sequence
、xs:choice
或xs:all
。 (如前所述回答:不允许。)以上是关于如何声明一个 complexType 只有一个子元素?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WebAPI 返回 Dictionary<complexType,int>