2009-07-19 1 views
3

У меня есть XML, определяющий свойства, как:XSD: свойства модели (пары имя/значение)

<properties> 
    <property name="play_sound" value="true" /> 
    <property name="duration" value="30" /> 
</properties> 

Можно ли с схемой XML, определяет условия, такие как «если имя свойства„длительность“ то значение должно быть целым числом ". Я думаю, что это невозможно, что является рекомендуемым способом моделирования такой информации в XML-файле?

Я думал о чем-то вроде:

<properties> 
    <play_sound>true</play_sound> 
    <duration>30</duration> 
</properties> 

Таким образом, я могу определить restrictionos типа в моей схеме. Но что произойдет, если у меня есть сотни разных свойств, которые, вероятно, будут расти в будущем ...?

спасибо.

ответ

1

XML Schema 1.0 не имеет такого рода ограничений.

XML Schema 1.1, который в настоящее время находится в разработке.

Если вы используете движок Saxon XSLT/XQuery, в эксперименте используется ранняя реализация XML Schema 1.1.

Другой вариант - использовать Schematron.

Но, как правило, они обрабатываются внутри приложения. XML-схема справедлива при описании структуры данных, но не настолько хороша при фактической проверке содержимого.

1

Я не думаю, что вы можете применить это по названию свойства. Возможно, вы могли бы что-то сделать с Schematron.

Существует общий компромисс между сложной строгой схемой и расслабленной компактной схемой. Вы должны решить, что лучше в вашей ситуации, основываясь на том, для чего используется XML-файл, и как используется Xsd.

1

В XSD нет условной поддержки, чтобы делать то, что вы хотите. Для вас абсолютно важно, чтобы ваш XML был проверен парсером?

Если да, то только ваши варианты определения свойств как типы (как вы описали) или в качестве атрибутов (например, <my_object play_sound="true" duration="30"/>)

Обычно, однако, это не имеет значения, если проверка происходит на более позднем этапе (например, когда ваш XML переваривается вашим приложением), в этот момент достаточно легко сделать то, что вы хотите.

2

Рекомендуемым способом было бы моделировать ваш XML с конкретными атрибутами или элементами, имеющими определенные типы.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="properties"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="play_sound" type="xs:boolean"/> 
       <xs:element name="duration" type="xs:byte"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

<properties> 
    <play_sound>true</play_sound> 
    <duration>30</duration> 
</properties>