【问题标题】:Specify root element with general child element in XSD在 XSD 中指定具有一般子元素的根元素
【发布时间】:2013-07-18 05:51:47
【问题描述】:

我的 XSD 中的所有子元素都有基类

<xs:complexType name="BaseItem">
    <xs:attribute name="id" type="string" use="required"/>
</xs:complexType>

以及这个元素的扩展器

<xs:complexType name="Package">
    <xs:complexContent>
        <xs:extension base="BaseItem">
            <xs:sequence>
                <xs:element name="SubElement" type="SubElementType"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="Class">
    <xs:complexContent>
        <xs:extension base="BaseItem">
            <xs:sequence>
                <xs:element name="SubElement2" type="SubElementType2"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
.......
etc....

以及此 XSD 的 xml 示例:

XML1: &lt;Root&gt;&lt;Package id="xxx"&gt;&lt;SubElement/&gt;&lt;/Package&gt;&lt;/Root&gt;

XML2: &lt;Root&gt;&lt;Class id="xxx"&gt;&lt;SubElement2/&gt;&lt;/Class&gt;&lt;/Root&gt;

XML3: &lt;Root&gt;&lt;Method id="xxx"&gt;&lt;SubElement3/&gt;&lt;/Method&gt;&lt;/Root&gt;

XML4: &lt;Root&gt;&lt;Method id="xxx"&gt;&lt;SubElement3/&gt;&lt;/Method&gt;&lt;/Root&gt;

如何在此 XSD 中指定根元素而不定义所有可能的子元素?

<xs:element name="Root"> <xs:complexType> <xs:sequence> //????? </xs:sequence> </xs:complexType> </xs:element>

有什么方法可以通过基类型指定子代吗?嘘:

<xs:element name="Root"> <xs:complexType> <xs:sequence> <element type="BaseItem"/> </xs:sequence> </xs:complexType> </xs:element>

或者不指定元素名称这是不可能的?

【问题讨论】:

    标签: xml xsd


    【解决方案1】:

    您可以通过这种方式使用替换组 (http://www.w3schools.com/schema/schema_complex_subst.asp)

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xs:complexType name="base_item_type">
            <xs:attribute name="id" type="xs:string" use="required"/>
        </xs:complexType>
    
        <xs:complexType name="package_type">
            <xs:complexContent>
                <xs:extension base="base_item_type">
                    <xs:sequence>
                        <xs:element name="SubElement" type="xs:string"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    
        <xs:complexType name="class_type">
            <xs:complexContent>
                <xs:extension base="base_item_type">
                    <xs:sequence>
                        <xs:element name="SubElement2" type="xs:string"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    
        <!-- abstract attribute to prevent occurence of BaseElement-->
       <xs:element name="BaseElement" type="base_item_type" abstract="true"/>
    
        <!-- Package and Class element might be used instead of BaseElement-->
        <!-- But they also can be put as root element -->
        <xs:element name="Package" type="package_type" substitutionGroup="BaseElement" /> 
        <xs:element name="Class" type="class_type" substitutionGroup="BaseElement"/>
    
        <!-- Root element -->
        <xs:element name="RootElement">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="BaseElement" maxOccurs="unbounded" />
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
    </xs:schema>
    

    但我不确定它是否比根元素中的选择更好 - 只是因为通过这种方式,“包”和“类”也可以直接作为根元素放置。就我个人而言,我更喜欢一个有(虽然更大)选择的根元素。

    【讨论】:

    • 感谢您分享知识。我还将使用一个根元素。
    猜你喜欢
    • 2023-03-23
    • 2014-09-08
    • 1970-01-01
    • 2015-03-09
    • 2011-01-30
    • 2014-06-29
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    相关资源
    最近更新 更多