использование атрибута типа xml для производных сложных типов - PullRequest
3 голосов
/ 13 мая 2010

Я пытаюсь получить производные сложные типы из базового типа в схеме xsd.

это хорошо работает, когда я делаю это (вдохновленный этим ):

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>

При проверке xml с этой схемой с помощью xmllint (под linux) я получаю следующее сообщение об ошибке:

config.xsd: 12: element complexType: Ошибка синтаксического анализатора схем: Элемент {http://www.w3.org/2001/XMLSchema}sequence': Содержание не является действительным. Ожидаемый (аннотация ?, (элемент | группа | выбор | последовательность | любой)*). Схема WXS config.xsd не удалось скомпилировать

Есть идеи, что не так?

David

Ответы [ 2 ]

2 голосов
/ 13 мая 2010

Корневой элемент вашего XML-файла должен иметь все сложные типы, определенные в пространстве имен.

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

0 голосов
/ 13 мая 2010

xsd: элементы последовательности могут содержать только один из следующих списков дочерних элементов: не более одной аннотации и столько элементов , группы, выбора, последовательности, сколько угодно .

Ваш элемент последовательности содержит два элемента complexType, что недопустимо.

EDIT: Подробнее см. http://www.w3.org/TR/xmlschema-1/#element-sequence.

РЕДАКТИРОВАТЬ 2: sequence - это последовательность элементов , а не типов . Здесь нет полиморфизма. Недостаточно утверждать, что элемент X содержит последовательность A, B и все, что немного напоминает C, вы должны точно указать, какой C-подобный элемент вам нужен.

Ваши опции включают

a) Определите element элементы, которые соответствуют типам Person и Employee на корневом уровне (т. Е. В xs: схема), и обратитесь к ним в staffRecord с element[@ref]

b) обернуть два элемента complexType в два отдельных элемента element.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...