Ограничение значений в списке клавиш XML с использованием xsd

StackOverflow https://stackoverflow.com/questions/7310258

  •  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 соответствующая пара.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top