XML模式:全部,序列组(XML Schema: all, sequence & groups)

2019-06-24 22:51发布

我写的第一次的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>

这是架构吗? 这项工作直接与此验证和这一个了 ,但XML工具插件记事本++说:“无法解析架构文件”。

PS:我写了这个模式,因为我想有一个元素“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>

你知道的其他方式做到这一点?

谢谢

Answer 1:

你拥有的架构似乎根据1.0版本是无效的其中规定清楚这里(底)即

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

或者,尝试读取XML模式结构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元素的包装(如下面的E1)是什么。

<?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的元素,它们必须被包裹在个E1

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

要么

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

然后,它会验证一切...



文章来源: XML Schema: all, sequence & groups
标签: xml xsd schema