如何使用子元素或引用来改进XML模式?

时间:2018-11-29 01:22:50

标签: xml xsd xml-schema-collection

我有一个xml模式,如下所示,但是我注意到维护起来非常复杂。

我想通过以下其中一种方法来改进当前架构,但是我不确定它们是否是最佳/正确的途径:

选项1:使用movieDetailsmovies的所有元素的引用。

选项2:movieDetails添加为movies的子元素(坦率地说,我正在努力实现)

哪种路线是最好的,什么是构造它的最佳方法?

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                    targetNamespace="http://xml.netbeans.org/schema/AmazingMovies"
                    xmlns:tns="http://xml.netbeans.org/schema/AmazingMovies"
                    elementFormDefault="qualified">

    <xsd:complexType name="movies">
        <xsd:sequence>
            <xsd:element name="Title" type="xsd:string"/>
            <xsd:element name="Director" type="xsd:string"></xsd:element>
            <xsd:element name="Year" type="xsd:int"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="movieDetails">
        <xsd:sequence>
            <xsd:element name="Actor" type="xsd:string"/>
            <xsd:element name="numberOfCast" type="xsd:int"></xsd:element>
            <xsd:element name="releaseDate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="OnDisplay">
        <xsd:complexType>
            <xsd:sequence >
                <xsd:element name="collectionOfMovies" type="tns:movies" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

其他信息

  

OnDisplay元素会将movies的所有元素添加到列表中,以便在解组时使用它们。但是,我也想将movieDetails添加到OnDisplay上,因此,将它们作为引用,子元素或其他形式包含在movies中会很方便。

尝试了以下方法,但XML验证失败

  

方法1

<xsd:element name="MoviesAndDetails">
    <xsd:complexType name="movies">
        <xsd:sequence>
            <xsd:element name="Title" type="xsd:string"/>
            <xsd:element name="Director" type="xsd:string"></xsd:element>
            <xsd:element name="Year" type="xsd:int"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="movieDetails">
        <xsd:sequence>
            <xsd:element name="Actor" type="xsd:string"/>
            <xsd:element name="numberOfCast" type="xsd:int">     </xsd:element>
            <xsd:element name="releaseDate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>
  

方法2

<xsd:complexType name="MoviesAndDetails">
    <xsd:complexType name="movies">
        <xsd:sequence>
            <xsd:element name="Title" type="xsd:string"/>
            <xsd:element name="Director" type="xsd:string"></xsd:element>
            <xsd:element name="Year" type="xsd:int"/>
            <xsd:element ref="Actor"/>
            <xsd:element ref="numberOfCast"/>
            <xsd:element ref="releaseDate"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="movieDetails">
        <xsd:sequence>
            <xsd:element name="Actor" type="xsd:string"/>
            <xsd:element name="numberOfCast" type="xsd:int">     </xsd:element>
            <xsd:element name="releaseDate" type="xsd:date"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

1 个答案:

答案 0 :(得分:0)

如果您希望将movieDetails元素作为collectionOfMovies的子元素,则可以将movieDetails类型的tns:movieDetails元素添加到{{1 }}元素。

movies