2010-01-14 2 views
4

Я пытаюсь написать схему XML, которая позволяет XML быть выражены следующим образом:Наиболее эффективное Schema для того или иного, или это и что

домашние могут containt как кошки и собаки элементы:

<root> 
    <pets> 
    <cat /> 
    <dog /> 
    </pets> 
</root> 

домашние могут содержать только кошки или собаки элементы

<root> 
    <pets> 
    <cat /> 
    </pets> 
</root> 
----------- 
<root> 
    <pets> 
    <dog /> 
    </pets> 
</root> 

если домашние не имеют вложенных элементов, то она должна отсутствовать:

<root> 
</root> 

Лучшая схема, которую я придумал, чтобы удовлетворить эти условия, это:

<xs:element name="pets"> 
    <xs:complexType> 
    <xs:choice> 
     <xs:sequence> 
     <xs:element name="cat"/> 
     <xs:element name="dog" minOccurs="0"/> 
     </xs:sequence> 
     <xs:sequence> 
     <xs:element name="dog"/> 
     </xs:sequence> 
    </xs:choice> 
    </xs:complexType> 
</xs:element> 

Это всегда казалось, мне нравится слишком много схемы для такой простой концепции. Есть ли более простой способ написать эту схему? Благодаря!

ответ

2

Решение, которое вы предоставляете в своем вопросе, является наиболее распространенным решением. Помимо идеи группы в другом ответе, нет лучшего способа. Лично я предпочитаю ваше решение.

Большие стандартные схемы (например, FpML) используйте ваш рисунок.

3

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

<xs:group name="pets_group"> 
    <xs:element name="pets" minOccurs="0" maxOccurs="1"> 
    <xs:complexType> 
     <xs:choice> 
     <xs:sequence> 
      <xs:element name="cat"/> 
      <xs:element name="dog" minOccurs="0"/> 
     </xs:sequence> 
     <xs:sequence> 
      <xs:element name="dog"/> 
      <xs:element name="cat" minOccurs="0"/> 
     </xs:sequence> 
     </xs:choice> 
    </xs:complexType> 
    </xs:element> 
</xs:group> 

Тогда вместо того, чтобы использовать элемент домашних животных, используйте pets_group группы:

<xs:element name="root"> 
    <xs:complexType> 
    <xs:group ref="pets_group"/> 
    </xs:complexType> 
</xs:element> 

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

В качестве альтернативы вы можете определить их вместе, просто «вставкой» ссылки на группу. Вероятно, это то, что вы хотите сделать, если тег домашних животных используется только в одном месте.