使用xml type属性导出复杂类型

时间:2010-05-13 12:45:28

标签: xml schema

我正在尝试从xsd架构中的基类型派生派生的复杂类型。

当我这样做时(由this启发)它很有效:

xml文件:

     <person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:type="Employee">
        <name>John</name>
        <height>59</height>
        <jobDescription>manager</jobDescription>
     </person>

xsd文件:

     <xs:element name="person" type="Person"/>

         <xs:complexType name="Person" abstract="true">
         <xs:sequence>
            <xs:element name= "name" type="xs:string"/>
            <xs:element name= "height" type="xs:double" />
         </xs:sequence>
         </xs:complexType>

         <xs:complexType name="Employee">
         <xs:complexContent>
             <xs:extension base="Person">
                <xs:sequence>
                   <xs:element name="jobDescription" type="xs:string" />
                </xs:sequence>
              </xs:extension>
          </xs:complexContent>
         </xs:complexType>

但是,如果我想在其中包含person元素,例如,另一个复杂类型的序列,它将不再起作用:

的xml:

    <staffRecord>
      <company>mycompany</company>
      <dpt>sales</dpt>
      <person
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:type="Employee">
        <name>John</name>
        <height>59</height>
        <jobDescription>manager</jobDescription>
      </person>
    </staffRecord>

xsd文件:

<xs:element name="staffRecord">
    <xs:complexType>
    <xs:sequence>
        <xs:element name="company" type="xs:string"/>
        <xs:element name="dpt" type="xs:string"/>

        <xs:element name="person" type="Person"/>

            <xs:complexType name="Person" abstract="true">
             <xs:sequence>
                <xs:element name= "name" type="xs:string"/>
                <xs:element name= "height" type="xs:double" />
             </xs:sequence>
            </xs:complexType>

            <xs:complexType name="Employee">
             <xs:complexContent>
                <xs:extension base="Person">
                   <xs:sequence>
                      <xs:element name="jobDescription" type="xs:string" />
                   </xs:sequence>
                 </xs:extension>
             </xs:complexContent>
            </xs:complexType>


    </xs:sequence>
    </xs:complexType>
</xs:element>

使用xmllint(在linux下)验证带有该架构的xml时,我收到以下错误消息:

  

config.xsd:12:element complexType:   模式解析器错误:元素   '{http://www.w3.org/2001/XMLSchema}序列':   内容无效。预计是   (注释?,(元素|组|   选择|序列|任何)*)。 WXS架构   config.xsd无法编译

知道出了什么问题吗?

大卫

2 个答案:

答案 0 :(得分:2)

XML文件的根元素应该在命名空间中定义所有复杂类型。

http://www.datypic.com/books/defxmlschema/chapter13.html

答案 1 :(得分:0)

xsd:sequence元素只能包含以下子元素列表之一: 最多一个注释,以及许多元素,组,选择,序列,任何,如您所愿。

你的sequence元素中有两个complexType元素,它们是无效的。

编辑: 有关详细信息,请参阅http://www.w3.org/TR/xmlschema-1/#element-sequence

编辑2: sequence是一系列元素,而不是类型。没有多态性。说明元素X包含序列A,B和看起来有点像C的任何东西都不够好,你必须准确说明你想要的C样元素。

您的选择包括,

a)定义与根级别的Person和Employee类型相对应的element元素(即在xs:schema下),并使用{{1}在 staffRecord 下引用它们}

b)将两个element[@ref]元素包装在两个单独的complexType元素中。