如何将2个xsd模式包含在1个xml文件中?

时间:2015-08-15 17:53:21

标签: xml xsd

我的问题是关于2个XSD架构,它们必须是XML文档的基础。对我来说,首先创建我需要的XML然后创建那些XSD架构会更容易。所以,我在这里有三个文件。

第一次XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.w3schools.com">

    <xs:element name="studentAI">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="gender">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="female"/>
                            <xs:enumeration value="male"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="age">
                    <xs:simpleType>
                        <xs:restriction base="xs:integer">
                            <xs:minInclusive value="0"/>
                            <xs:maxInclusive value="100"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="other" type="desc"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="desc">
        <xs:sequence>
            <xs:element name="height" type="xs:string"/>
            <xs:element name="weight" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

第二届XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.w3schools.com">

    <xs:element name="group">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="student" minOccurs="2" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="student">
        <xs:sequence>
             <xs:element name="surname" type="xs:string"/>
           <xs:element name="name" type="xs:string"/>
            <xs:element name="birthday">
                <xs:simpleType>
                    <xs:restriction base="xs:date"/>
                </xs:simpleType>
            </xs:element>
            <xs:element name="parents" type="parentsDetails"/>
            <xs:element name="allCourses" type="allCoursesDetails"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string" use="required"/>
    </xs:complexType>

    <xs:complexType name="parentsDetails">
        <xs:sequence>
           <xs:element name="father" type="xs:string"/>
           <xs:element name="mother" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

   <xs:complexType name="allCoursesDetails">
        <xs:sequence>
            <xs:element name="course" type="courseDetails" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
   </xs:complexType>

    <xs:complexType name="courseDetails">
        <xs:attribute name="nr" use="required"/>
    </xs:complexType>

</xs:schema>

我需要在这两个XSD架构的基础上获取XML文档(抱歉,它现在已经空了,但当然必须有信息,并且组中将有多个学生):< / p>

<group xmlns:xs="http://www.w3schools.com"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.w3schools.com ">

    <student id="1">
        <surname></surname>
        <name></name>
        <birthday></birthday>
        <parents>
            <father></father>
            <mother></mother>
        </parents>
        <allCourses>
            <course nr="01"></course>
            <course nr="02"></course>
        </allCourses>
        <studentAI>
            <gender></gender>
            <age></age>
            <other>
                <height></height>
                <weight></weight>
            </other>
        </studentAI>
    </student>
</group>

我真的不知道如何在我的XML文档中包含这2个XSD架构。我是否应该将它们都包含在XML文档中,或者我应该首先将第一个XSD架构包含在第二个XSD架构中(因为它是结果XML),然后将统一的架构包含在XML文档中?怎么做?

我最大的问题是所有三个文件的上半部分,其中一个应该放置名称空间的声明等等。

至于我尝试使用它的程序是Oxygen(我有30天lisense)。

我真的希望有人会帮助我。我也希望我的问题很明确。

许多人提前感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以在两个架构中合并两个架构的内容,使架构包含另一架构。无论如何,你应该纠正这个问题:

  1. 如果您使用nameref来引用命名空间中的元素,则需要限定该引用(或者只是将您的targetNamespace用作xsds中的默认命名空间,这样更容易) 。因此,将您的targetNamespace绑定到前缀

    xmlns:w3="http://www.w3schools.com"
    

    然后更正您的参考资料,例如:

    <xs:element name="allCourses" type="w3:allCoursesDetails"/>
    

    或者只是在xsds中将targetNamespace设置为默认命名空间

    xmlns="http://www.w3schools.com"
    

    这种方式,非限定引用指向默认命名空间,即设置为目标命名空间。

  2. 如果您希望XML对属于targetNampesce的所有元素都有效,那么您应该在您/您的elementFormDefault="qualified"使用xs:schema 。否则,您的某些XML元素应属于目标命名空间,其中一些不应属于任何命名空间。

  3. 将第一个架构的内容添加到包含 student 元素的架构中,或者添加一个包含学生的包含子句架构包括 studentAI

    <xs:include schemaLocation="studentAI.xsd"/>
    
  4. 之后,您只需要根据包含 student 元素的模式验证XML,因此您需要在XML中添加xsi:schemaLocation :< / p>

    xsi:schemaLocation="http://www.w3schools.com xsd1.xsd"
    
  5. 请记住,您可以使用ref 引用元素。您需要在序列中的 allCourses 元素之后添加 studentAI

    <xs:element name="allCourses" type="allCoursesDetails"/>
    <xs:element ref="studentAI"/>
    
  6. 另外请记住,您可以简化生日元素,如果您没有添加任何限制,则不需要限制元素。

  7. 希望这会对你有所帮助。

    编辑:添加了更多内容(第5项和第6项)。