如何声明一个 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>

显然,sequencechoiceall 对于单个元素不是必需的,因为它们应该用于指示多个元素的顺序。 有没有更简洁的方法来声明一个只有一个子元素的complexType(即一种消除使用sequenceallchoice 的方法。)

【问题讨论】:

Early working drafts of the schema spec 如果您将 element 声明直接嵌套在 complexType 中,则假定隐式 sequence,但在规范达到其最终形式之前已将其删除,以支持始终要求显式 @ 987654334@、choiceall 好的,我会选择顺序:) 【参考方案1】:

仅消除xs:sequencexs:choicexs:all 是不可行的:

  <xs:complexType name="cType">
    <xs:element name="e"/> 
  </xs:complexType>

无效。

参见XML Representation of Complex Type Definitions,其中complexType的内容模型定义如下:

(注解?, (simpleContent | complexContent | ((group | all |选择 |序列)?,((属性|属性组)*, 任何属性?))))

没有规定elementcomplexType 的直系子代。

【讨论】:

你的解释和网址让一切都清楚了,谢谢!所以看起来 XML Schema 没有提供一种紧凑的方式来声明单个元素 complexType,我必须始终将单个元素放入所有 |选择 |序列 |组。 你可以为所有 |选择 |序列 |组添加限制 maxOccurs = "1",这至少会将出现次数限制为一次: @DEX: maxOccurs 已经默认为1。此外,对于只允许单个子元素的简单情况,OP 的问题是完全省略xs:sequencexs:choicexs:all。 (如前所述回答:不允许。)

以上是关于如何声明一个 complexType 只有一个子元素?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Spark Dataframe 的架构

如何使用 WebAPI 返回 Dictionary<complexType,int>

LUA - 创建元表,每个子表再次成为元表

如何使用混合值(整数和字符串)限制更改XML / XSD中的complexType?

一个 在BrowserRouter中可能只有一个子元素

如何从返回的数据组件 vuejs 中拼接一个子数组?