以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 DTD/XML Schema 』  (http://bbs.xml.org.cn/list.asp?boardid=23)
----  [求助]请问如何用XML Schema实现无序和可选的element和Attribute  (http://bbs.xml.org.cn/dispbbs.asp?boardid=23&rootid=&id=54301)


--  作者:luver
--  发布时间:10/25/2007 11:53:00 AM

--  [求助]请问如何用XML Schema实现无序和可选的element和Attribute
有这样的XML实例
<?xml version="1.0"?>
<root>
    <text att1="a" att2="b">
    <text att1="a" att2="b">
    <button att1="a" att2="b">
    <button att1="a" att2="b">
    <input att1="a" att2="b">
    <input att1="a" att2="b">
</root>

其中<text>,<button>,<input>可以有0个或多个,且无序,它们的属性无序且不必须有.
这样的限制该如何实现?

看了一下choice, all, sequence都不能满足,不知还有何方法?


--  作者:luver
--  发布时间:10/25/2007 2:19:00 PM

--  
这里人还真是少, 试了下 all ,可以实现element的无序和可选
--  作者:luver
--  发布时间:10/29/2007 11:18:00 AM

--  
上个星期通过查MSXML6.0的SDK,然后试了N次,大致发现这些规则:
================================================
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" >
<xsd:element name="root" type="controlList"/>

<!-- controls list -->
<xsd:complexType name="controlList">
<xsd:choice minOccurs="0" maxOccurs="2">
    <xsd:element name="text" minOccurs="0" maxOccurs="2" type="text"/>
    <xsd:element name="button" minOccurs="0" maxOccurs="unbounded" type="button"/>
    <xsd:element name="input" minOccurs="0" maxOccurs="3" type="input"/>
</xsd:choice>
</xsd:sequence>
</xsd:complexType>

。。。。。//省略掉若干
</xsd:schema>
================================================

用<all>时
  maxOccurs= 1: 1
   minOccurs= (0 | 1): 1
maxOccurs只能为1,minOccurs可以为0或1,1为默认值.同时在<all>里的
<element>的maxOccurs,minOccurs也只能为0或1,取其它值就会报XSD内容错误。这样就是说用all的话,里面的元素最多就只能出现1次(是无序的,而且可选)。


然后改用<choice>
  maxOccurs= (nonNegativeInteger | unbounded) : 1
  minOccurs= nonNegativeInteger : 1
然后发现里面的元素可以无序、可选,不过存在一个问题就是:<choice>的maxOccurs属性标定的是它里面<element>一共可以出现的个数,,但是<element>属性的maxOccurs就失去作用了,即XML文档中出现超过maxOccurs个数的这个<element>也不会报错,只是所有<element>的总数超过choice的maxOccurs时才报错。

然后试了下<sequence>
  maxOccurs = (nonNegativeInteger | unbounded) : 1
  minOccurs = nonNegativeInteger : 1
印象中使用这个后,所有元素都必须按规定的顺序出现,当sequence的maxOccurs为默认的1时,element的maxOccurs还是起作用的,各个element也是要按顺序出现的。
当sequence的maxOccurs大于等于2时就会有很多千奇百怪的问题了:好像element不按顺序也可以了;element的maxOccurs也失灵了。
最后慢慢分析,还是发现了里面的规则:其实sequence在任何时候都是要求element的顺序的,不过它的maxOccurs=n的意义是“在XML实例里最多可以出现n个符合规定的顺序序列”,
比如:
<sequence maxOccurs=n>
<element a  minOccurs=0>
<element b minOccurs=1>
<element c minOccurs=1>
</sequence>
========
有这样的XML文档: <a/>    <a/><b/>    <b/></c>   <a/><b/><c/>   
上述空格之间就是一个有效序列,当n >= 4时上述XML就是有效的XML文档。

不过要注意的是如果 element a的minOccurs=1,那么不管n等于多少,上面的序列都会通不过,因为检查卡在第三个序列<b/></c>。

OK,就这些了,上述测试是用MSXML6.0,在VC++环境下进行的


--  作者:hongjuesir
--  发布时间:10/30/2007 6:04:00 PM

--  
不错,支持一下!人确实少了些。
--  作者:danielhy
--  发布时间:10/31/2007 1:31:00 PM

--  
<a/><b/><a/>
出现类似这样的序列呢
请给出完整的代码


--  作者:luver
--  发布时间:10/31/2007 3:14:00 PM

--  
呵,其实可以这样理解我那个<sequence>:
<sequence maxOccurs=n>
<element a  minOccurs=0>
<element b minOccurs=1>
<element c minOccurs=1>
</sequence>

第一个可以为<a/>或<b/>,出现<b/>之后必须出现<c/>,否则该有效序列结束
所以<a/><b/><a/>  这个序列在n>=2时,是满足的。

完整代码是指那个schema例子吗,借用别人发的一个:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified">
    
    <xs:element name="root" type="rootType" />
   
    <xs:complexType name="rootType">
        <xs:choice minOccurs="0" maxOccurs="unbound">
            <xs:element name="text" type="myElement" minOccurs="0" maxOccurs="unbound"></xs:element>
            <xs:element name="button" type="myElement" minOccurs="0" maxOccurs="unbound"></xs:element>
            <xs:element name="input" type="myElement" minOccurs="0" maxOccurs="unbound"></xs:element>
        </xs:choice>
    </xs:complexType>    

    <xs:element name="myElement">
        <xs:complexType name="temp">
            <xs:attribute name="att1" type="xs:string"></xs:attribute>
            <xs:attribute name="att2" type="xs:string"></xs:attribute>
        </xs:complexType>
    </xs:element>
    
</xs:schema>


--  作者:danielhy
--  发布时间:11/1/2007 10:28:00 AM

--  
恩,看来是对概念还没理解好哈,SEQUENCE和ELEMENT的minOccurs定义不同
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
1,375.000ms