XSD: свойства модели (пары имя / значение) - PullRequest
3 голосов
/ 20 июля 2009

У меня есть свойства, определяющие XML, такие как:

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

Возможно ли в схеме XML указать такие условия, как «если имя свойства равно« duration », то значение должно быть целым числом». Я думаю, что это невозможно, поэтому, какой рекомендуемый способ моделировать такую ​​информацию в файле XML?

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

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

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

Спасибо.

Ответы [ 4 ]

2 голосов
/ 20 июля 2009

Рекомендованным способом было бы моделировать ваш 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>
1 голос
/ 20 июля 2009

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

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

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

1 голос
/ 20 июля 2009

XML Schema 1.0 не имеет подобных ограничений.

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

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

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

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

1 голос
/ 20 июля 2009

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

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

...