2013-06-03 7 views
1

То, что я пытаюсь выполнить, - это создание XML-схемы, описывающей XML-файл, который может принимать одну из двух форм. Существует раздел общих элементов между ними, а затем небольшой раздел, который отличается. Что-то вроде:XML-выбор без вложенности

<Dessert> 
    <Identifier> Hot Fudge Sundae </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 2 </Duration> 
    <Size> SuperScooper </Size> 
</Dessert> 

<Dessert> 
    <Identifier> Dutch Apple Pie </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 1 </Duration> 
    <AlaMode> 1 </AlaMode> 
    <IceCreamFlavor> Vanilla </IceCreamFlavor> 
</Dessert> 

Так для кремовых десертов льда есть только Размер в то время как для пирогов есть более AlaMode индикатор и IceCreamFlavor спецификатор.

То, что я хочу сделать, чтобы использовать xs:choice спецификатор, чтобы указать, что Dessert XML либо иметь один или другой (Size или AlaMode и IceCreamFlavor), так что я могу проверить их.

То, что я пытался сделать, это создать два типа, и сделать что-то вроде этого:

, а затем сделать что-то вроде:

<xs:choice> 
    <xs:element name="Sundae" type="SundaeType" /> 
    <xs:element name="Pie" type="PieType" /> 
</xs:choice> 

И но полученный XML, конечно, имеет макет так:

<Dessert> 
    <Identifier> Hot Fudge Sundae </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 2 </Duration> 
    <Sundae> 
    <Size> SuperScooper </Size> 
    <Sundae> 
</Dessert> 

Который не соответствует существующей файловой структуры.

Я могу просто объединить все возможные элементы и покончить с вещами xs:choice, но это действительно не передает ожиданий формата (то есть, например, недействительно для sundae иметь AlaMode элемент).

Есть ли способ сделать это? Я подозреваю, что если бы у меня было только одно поле, я мог бы выполнить это с помощью xs:choice (возможно) и не иметь этого дополнительного уровня. Или, может быть, я просто что-то пропустил.

И да, я понимаю, что макет не самый лучший, но это существующий формат, который я действительно могу изменить на этом этапе.

ответ

2

Если вы не возражаете, устанавливающее порядок на элементах в исходных документах вы можете сделать эту работу с помощью хз: последовательность:

<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="Dessert"> 
     <xs:sequence> 
      <xs:element name="Identifier" type="xs:string"/> 
      <xs:element name="SaleDate" type="xs:int"/> 
      <xs:element name="Duration" type="xs:int"/> 
      <xs:choice> 
       <xs:element name="Size" type="xs:string"/> 
       <xs:sequence> 
        <xs:element name="AlaMode" type="xs:int"/> 
        <xs:element name="IceCreamFlavor" type="xs:string"/> 
       </xs:sequence> 
      </xs:choice> 

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

    <xs:element name="Dessert" type="Dessert"/> 
</xs:schema> 
+0

Спасибо за ответ. Это было полезно для меня. – itsmatt

Смежные вопросы