Author: | Thinkhy |
Date: | 2010.02.06. |
Keyword: | XML Schema indicator choice occurs 无序元素 |
URL: | http://www.disandu.com/?p=651 |
水木XML版(http://XML.board.newsmth.net/)上曾有网友提出了下面的问题:
发信人: cell (汤锅), 信区: XML 标 题: 请教个XSD的问题,多个无序元素 发信站: 水木社区 (Mon Dec 21 14:29:58 2009), 转信
在设计一个XSD的Schema,有个问题请教一下:
现在我有3个元素,希望它们以任意顺序和个数出现在一个复合类型里面,这个类型应 该如 何定义呢?试了下用sequence或者all好像都不行。
譬如下面这个XML例子,它的schema应该如何定义呢?
<TestElement>
<A/> <B/> <C/> <B/> <A/> <C/> </TestElement>
这类问题经常会在XML版上出现,在stackoverflow上也出现过类似的问题讨论( http://stackoverflow.com/questions/839079/middle-way-between-xsd-all-and-xsd-sequence#839110),但似乎也没得出结论。大家对无序元素的观点基本可以归纳为以下三种:
-
XSD的设计思想中摒弃了无序元素这种展现方式,所以sequence下元素属性有序,all下元素最多出现一次;
-
此问题现在还处于无解阶段,XSD 1.X标准将会解决;
-
添加一个元素将同名元素包装起来,例如上例中添加一个As元素用来包装A元素,形式如下:
-
<As>
-
<A>...</A> <A>...</A> ... ... </As>
-
实际上我在项目也遇到过此类问题,我采取的第三种解决方式,实际上这也是大多数人采用的方法。或许W3C并不提倡无序元素这种数据组织方式,所以这个问题没有明显的解决办法,但W3C也没有完全摒弃这种设计方式,而XSD标准是出了名的复杂,不能奢望通过研读XSD标准文档来找到解决之道。怎么办? 无意之间,我在水木XML版看到下面的帖子:
发信人: gmnicx (Mr.Zhuang|2010 完美毛毛), 信区: XML 标 题: Re: 使用choice标签的时候,下列需求如何实现 发信站: 水木社区 (Tue Jan 5 17:32:46 2010), 转信
明白了,原来occurs要写到choice标签里面 【 在 gmnicx (Mr.Zhuang|2010 完美毛毛) 的大作中提到: 】 : choice组有若干可能出现(可能不出现,也可能一个出现多次) : 但要求总数至少出现一次 : 例如 : ...................
原来choice可以加 occurs属性,那么无序元素的问题便迎刃而解了,且看下面的XSD:
<?xml version="1.0" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="TestElement"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="A" type="xs:anyType"/> <xs:element name="B" type="xs:anyType"/> <xs:element name="C" type="xs:anyType"/> </xs:choice> </xs:complexType> </xs:element> </xs:schema>
choice加上两个Occurs属性,无序元素的问题到此便宣告解决了。 且慢,从上面的故事,我明白了两个道理:
1.洋人的讨论未必出真知,对于这个问题,stackoverflow并没给出结论。
2.人民群众的力量是无穷的。网络上的论坛、BBS、博客都提供了交流平台,无谓菜鸟还是专家,都可以在这些平台自由发表自己的见解,而解决问题的方法往往不是出自教堂里的大主教,而是来源于每个网民的点滴观点,这正如点滴之水能汇成江河。