XML Schema:all,sequence&组

时间:2012-05-29 23:45:42

标签: xml xsd schema

我是第一次编写XML模式,我发现了一些有用的工具来帮助我编写它。

现在我处于一种奇怪的境地。我写的模式对某些工具有效,而对其他工具则无效。 该模式是“所有”,“序列”和“组”的混合。这是我的XML架构:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:group name="test">

        <xsd:all>
                <xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e3" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e4" minOccurs="0" maxOccurs="1"/>
        </xsd:all>
    </xsd:group>

    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="e1" maxOccurs="unbounded"/>
                <xsd:group ref="test"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

这个架构是对的吗? 它与this validatorthis one too一致,但Notepad ++的XML Tools插件显示“无法解析模式文件”。

P.S:我写了这个模式,因为我希望有一个元素“e0”,可以混合使用e1,e2,e3和e4。 e2,e3和e4应出现0或1次,e1可能出现在有限时间内。 例如,这个XML文件应该通过:

<e0>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e2/>
</e0>

<e0>
   <e2/>
   <e3/>
   <e4/>
</e0>

<e0>
   <e1/>
   <e2/>
   <e3/>
   <e4/>
</e0>

你知道另一种方法吗?

由于

1 个答案:

答案 0 :(得分:5)

根据表明plainly here (Primer)

的1.0版本,您拥有的架构似乎无效

XML Schema stipulates that an all group must appear as the sole child at the top of a content model.

或者,尝试阅读XML Schema Structures here的3.8.6节。在你的列表中我会添加.NET的XSD处理器,在你的情况下会抱怨:

The group ref to 'all' is not the root particle, or it is being used as an extension.

使用XSD 1.0,除非你为e1元素构建一个包装器(下面是e1s),否则没有任何解决方案可以很好地提供你想要的结果和一个简洁的语法。

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:group name="test">
        <xsd:all>
            <xsd:element name="e1s" minOccurs="0">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="e1" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="e2" minOccurs="0"/>
            <xsd:element name="e3" minOccurs="0"/>
            <xsd:element name="e4" minOccurs="0"/>
        </xsd:all>
    </xsd:group>
    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:group ref="test"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema> 

说到e1元素,它们必须包装在e1s

<e0>
    <e1s>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
    </e1s>
    <e2/>
</e0>  

<e0>
    <e1s>
        <e1/>
    </e1s>
    <e2/>
    <e3/>
    <e4/>
</e0>     

然后它全部验证......