作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在尝试编写一个 XML 模式,允许以下列方式表达 XML:
pets 可以同时包含 cat 和 dog 元素:
<root>
<pets>
<cat />
<dog />
</pets>
</root>
宠物可以只包含猫或狗元素
<root>
<pets>
<cat />
</pets>
</root>
-----------
<root>
<pets>
<dog />
</pets>
</root>
如果 pets 没有子元素,那么它应该不存在:
<root>
</root>
我想出的满足这些条件的最佳模式是这样的:
<xs:element name="pets">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="cat"/>
<xs:element name="dog" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element name="dog"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
在我看来,对于这样一个简单的概念来说,它的架构太多了。有没有更简单的方法来编写这个模式?谢谢!
最佳答案
我认为这是使用 xs:group 元素的理想情况:如果你将它包裹在你的元素周围并使其成为可选的(同时使元素的内容成为强制性的),你将获得所需的效果。
<xs:group name="pets_group">
<xs:element name="pets" minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="cat"/>
<xs:element name="dog" minOccurs="0"/>
</xs:sequence>
<xs:sequence>
<xs:element name="dog"/>
<xs:element name="cat" minOccurs="0"/>
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:group>
然后不使用 pets 元素,而是使用 pets_group 组:
<xs:element name="root">
<xs:complexType>
<xs:group ref="pets_group"/>
</xs:complexType>
</xs:element>
在一只猫后面跟着一只可选的狗和一只狗后面跟着一只可选的猫之间进行选择确保宠物标签中有东西。由于没有宠物标签,您可以不指定任何宠物。
或者,您可以一起定义它们,只需“内联”组引用即可。如果 pets 标签只用在一个地方,这可能是您想要做的。
关于xml - This OR That 或 This AND That 的最有效模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064885/
我是一名优秀的程序员,十分优秀!