XSD重用节点或复制

时间:2013-11-30 12:59:03

标签: xsd

我想知道执行xsd的正确方法,因为我的xsd中的某些节点可能会在其他xsd中重用。与搜索项目请求中一样,我将使用

<xs:element name="Item">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Name" type="xs:string"/>
                <xs:element name="Price" type="xs:double"/>
                <xs:element name="SupplierCode" type="xs:string"/>
                <xs:element name="Supplier" type="xs:string"/>
                <xs:element name="SupplierName" type="xs:string"/>
                <xs:element name="Manufacturer" type="xs:string"/>
                <xs:element ref="CustomerReviews" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute name="model" type="xs:string" use="required"/>
            <xs:attribute name="href" type="xs:string" use="required"/>
        </xs:complexType>
    </xs:element>

然后我可能需要在另一个xsd中使用它。

我应该重复它还是用它制作一个xsd并引用它?

My Current xsd with include

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://www.itwholesaledeluxe.com" targetNamespace="http://www.itwholesaledeluxe.com" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:include schemaLocation="Item.xsd"/>
    <xs:element name="Search-Item-Request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Items">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Item" type="Item"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

然后项目xsd部分因为它太大而无法发布

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="http://www.itwholesaledeluxe.com">

        <xs:complexType name="Item">
            <xs:sequence>
                <xs:element name="Name">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:maxLength value="50"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                        </sequence>
                </complexType>
</xs:schema>

1 个答案:

答案 0 :(得分:1)

关注DRY:如果它是同一个对象(在同一命名空间中):创建一个xsd并引用它。

这样,如果在某个时刻更改了对象,您只需要进行一次更改。此外,为此对象生成的任何代码只需生成一次。

使用以下xsd作为参考:

Main.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:ns1="http://www.itwholesaledeluxe.com" targetNamespace="http://www.itwholesaledeluxe.com"
    elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:include schemaLocation="Item.xsd" />
    <xs:element name="Search-Item-Request">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Items">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Item" type="ns1:Item" />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Item.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" attributeFormDefault="unqualified"
    targetNamespace="http://www.itwholesaledeluxe.com">
    <xs:complexType name="Item">
        <xs:sequence>
            <xs:element name="Name">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:maxLength value="50" />
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:schema>