Ограничение значений в списке клавиш XML с использованием xsd
-
26-10-2019 - |
Вопрос
У меня есть XML -документ с (в основном) выглядит так:
...
<param>
<key>age</key>
<value>10</value>
</param>
<param>
<key>smart</key>
<value>true</value>
</param>
...
Я хотел бы ограничить доступные значения на основе ключа параметра, например, возраст должен быть целым числом в [0, 150], а SMART должен быть либо верным, либо ложным.
Теперь, если бы XML был другим (например, как в примере ниже), это было бы очень просто:
...
<age>10</age>
<smart>true</smart>
...
Тем не менее, структура XML не изменится на этом этапе, и я не уверен, что это должно. Есть ли способ реализовать такие ограничения с текущей структурой XML, и если да, то как?
ОБНОВИТЬ:
Судя по (полному отсутствию) обратной связи, я бы сказал, что вполне вероятно, что это невозможно использовать XSD. Кто -нибудь может подтвердить?
Решение
Похоже, вам практически нужно определение, которое выглядит примерно так:
<!-- This is an INVALID example -->
<xs:element name="param">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="age" />
<xs:element name="value" type="xs:decimal" />
</xs:sequence>
<xs:sequence>
<xs:element name="key" type="xs:string" fixed="smart" />
<xs:element name="value" type="xs:boolean" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
К сожалению, такой кусок кода приводит Неверная схема XML файл.
Хотя синтаксис верен, семантика нарушает правила схемы. Элементы с тем же именем и в той же области должны иметь тот же тип. В этом случае это особенно означает, что все <value>
Элементы, которые являются детьми <param>
Элементы должны иметь тот же тип.
Формально это Ограничение компонентов схемы: Объявления элементов согласованы. Анкет См. Также следующее ограничение компонента схемы; Как правило, вы не можете сделать тип элемента в зависимости от некоторых других значений в документе или от какой -либо информации об элементах в оставшейся части последовательности.
Обновлять
Я совершенно забыл это, но вы сможете получить желаемые ограничения, если вы указали желаемый тип В документе экземпляра Вместо того, чтобы определять это исключительно в схеме. Это можно сделать, добавив xsi:type
приписывать <value>
элементы.
Пример
<param>
<key>age</key>
<value xsi:type="xs:decimal">10</value>
</param>
<param>
<key>smart</key>
<value xsi:type="xs:boolean">true</value>
</param>
Конечно, это немного неудобно, потому что это требует изменения процесса генерации XML. Также это не дает никакой гарантии, что <key>
и определено xsi:type
соответствующая пара.