XSD:包含xs:any的元素的无序列表

时间:2016-12-22 06:11:05

标签: xml xsd

我有一个无序的元素列表,其中包含xs:any,尝试了多种选择和序列组合,它们都违反了" Unique Particle Attribution" 。 我的xml如下:

<mall id="Andaal">
    <eff>effRecorder</eff>
    <morr>id</morr>
    <todd>toddCurrentType == toddIdOldType</todd>
    <mall id="donAllId">
        <morr>id</morr>
        <eff>effRecorder</eff>
        <other>QuickCode</other>
        <mall id="mall2Id">
            <eff>TickerChainEff</eff>
            <morr>SourceId</morr>
            <other>TickerCode</other>
        </mall>
    </mall>
    <mall id="mall2SourceId">
        <eff>Listing2SourceEff</eff>
        <morr>id</morr>
        <other>other2Price</other>
        <other>ExpiryDate</other>
    </mall>
</mall>

xsd代码:

<xs:element name="mall" maxOccurs="unbounded" minOccurs="0">
    <xs:complexType mixed="true">
        <xs:sequence>
            <xs:element type="xs:string" name="eff" minOccurs="0"/>
            <xs:element type="xs:string" name="todd" minOccurs="0"/>
            <xs:element type="xs:string" name="morr" minOccurs="1"/>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
        </xs:sequence>
        <xs:attribute name="id" use="required">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="[A-Za-z_]+"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

请注意,元素efftoddmorr可以按任何顺序出现,并且它们可以在另一个mall元素内的层次结构中更深层次出现。

1 个答案:

答案 0 :(得分:3)

XSD 1.0

使用XSD 1.0无法实现。基本上,解析器需要能够拾取每个元素并给出其当前状态(明确地)它应该使用哪个模式元素来验证它。它不支持任何形式的展望。通过引入任何,你提供歧义,任何将匹配现有的eff,todd,morr元素,这可以通过向前看解决,但不支持。

所以你得到的最好的就是这个

enter image description here

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mall">
        <xs:complexType mixed="true">
            <xs:choice minOccurs="0" maxOccurs="unbounded">
                <xs:element name="eff" type="xs:string" minOccurs="0" />
                <xs:element name="todd" type="xs:string" minOccurs="0" />
                <xs:element name="morr" type="xs:string" minOccurs="0" />
                <xs:any minOccurs="0" namespace="##other" processContents="lax" />
            </xs:choice>
            <xs:attribute name="id" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="[A-Za-z_]+" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>

any 被约束为任何不是当前targetnamespace的命名空间。这可以防止模糊和一切都行。

除了....现在你有一个允许0-n eff,todd,morr元素的模式。所以它远非完美。

XSD 1.1

您可以使用openContent元素使用XSD 1.1完成您正在尝试的操作。

enter image description here

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mall">
        <xs:complexType mixed="true">
            <xs:openContent mode="interleave">
                <xs:any processContents="lax" />
            </xs:openContent>
            <xs:all>
                <xs:element name="eff" type="xs:string" minOccurs="0" />
                <xs:element name="todd" type="xs:string" minOccurs="0" />
                <xs:element name="morr" type="xs:string" minOccurs="1" />
            </xs:all>
            <xs:attribute name="id" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="[A-Za-z_]+" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>

这强制执行基于eff,todd&amp; amp;的基数规则。 morr同时允许你在它们之间加入任何其他内容,即

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com) -->
<mall xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="Schema11.xsd" id="_Mi___XW">
    <OTHER></OTHER>
    <eff>string</eff>
    <OTHER></OTHER>
    <todd>string</todd>
    <OTHER></OTHER>
    <morr>string</morr>
    <OTHER></OTHER>
</mall>

缺点是XSD 1.1还没有被widley支持,Xerces和其他一些解析器支持它,但不是很多。

<强>更新

更新以反映Michael Kay的评论。正如迈克尔指出的那样,XSD 1.1现在可以解决任何和命名元素之间的歧义。结果更简单。

enter image description here

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML 2017 Developer Bundle Edition (Trial) 15.0.0.7015 (https://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="mall">
        <xs:complexType mixed="true">
            <xs:all>
                <xs:element name="eff" type="xs:string" minOccurs="0" />
                <xs:element name="todd" type="xs:string" minOccurs="0" />
                <xs:element name="morr" type="xs:string" minOccurs="1" />
                <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax" />
            </xs:all>
            <xs:attribute name="id" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="[A-Za-z_]+" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
</xs:schema>