繁体   English   中英

XML模式:全部,序列和组

[英]XML Schema: all, sequence & groups

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

您知道其他方法吗?

谢谢

根据1.0版本,您所拥有的模式似乎无效, 此处在此处清楚地指出(Primer)

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元素(以下为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>     

然后全部验证...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM