[经验总结]XML Schema无序元素的组织方式真的无解吗?

21 篇文章 0 订阅
20 篇文章 0 订阅
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),但似乎也没得出结论。大家对无序元素的观点基本可以归纳为以下三种:

  1. XSD的设计思想中摒弃了无序元素这种展现方式,所以sequence下元素属性有序,all下元素最多出现一次;

  2. 此问题现在还处于无解阶段,XSD 1.X标准将会解决;

  3. 添加一个元素将同名元素包装起来,例如上例中添加一个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、博客都提供了交流平台,无谓菜鸟还是专家,都可以在这些平台自由发表自己的见解,而解决问题的方法往往不是出自教堂里的大主教,而是来源于每个网民的点滴观点,这正如点滴之水能汇成江河。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值