XSD без порядка и выборочного ограничения - PullRequest
0 голосов
/ 07 августа 2020

Мне нужно проверить XML, который содержит элементы в случайном порядке, и некоторые из них должны существовать, а некоторые - только один раз. Кстати, некоторые элементы могут быть вложены рекурсивно.

Например, есть комната, которая должна содержать одну дверь и любое количество ящиков и элементов. Боксы Могут содержать другие блоки и / или элементы.

Пример XML:

<Room>
    <Element />
    <Box>
        <Box>
            <Element />
            <Box></Box>
            <Element />
        </Box>
        <Element />
    </Box>
    <Door />
    <Element />
</Room>

Этот пример очень простой, но в моем случае есть много элементов, которые могут быть в <Room>. Рекурсия - не проблема. Проблема в том, чтобы сделать <Door> обязательным и в любом порядке с братьями и сестрами, которые не требуются.

UPD : вопрос о XSD 1.0, потому что я использую. NET и нет бесплатной библиотеки для XSD 1.1

1 Ответ

0 голосов
/ 11 августа 2020

Из того, что я читаю, я думаю, вам может потребоваться использовать индикаторы схемы (XSD).

Для получения дополнительной информации проверьте следующую ссылку: Индикаторы схемы

Случайный порядок

Из вашего вопроса:

Мне нужно проверить XML, который содержит элемент в случайный порядок

Возможный ответ:

Используя индикатор Все (см. ссылку ), вы можете указать, что элементы находятся в случайном порядке .

Индикатор всех

Индикатор указывает, что дочерние элементы могут появляться в любом порядке, и что каждый дочерний элемент должен встречаться только один раз:

События

Из вашего вопроса:

некоторые из них должны существовать, а некоторые - однажды

Возможный ответ:

Если я правильно понимаю, вы хотите указать количество раз, когда элемент существует или может быть используемый. Это называется возникновением, и его снова можно найти по следующей ссылке . Вам нужно будет определить minOccurs и maxOccurs в соответствии с вашими требованиями.

Индикаторы появления

Индикаторы появления используются для определения того, как часто может возникать элемент.

Индикатор «maxOccurs» указывает максимальное количество раз, которое может встречаться элемент:

Индикатор «minOccurs» указывает минимальное количество раз, которое может встречаться элемент:

Все, включая примеры, могут можно снова найти на индикаторах XSD / схемы .

Как ваш XSD (xml схема), вероятно, будет выглядеть:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Room" type="Room_T"/>

  <xs:complexType name="Room_T">
    <xs:all>
      <xs:element name="Element" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="Box" type="Box_T" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="Door" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
    </xs:all>
  </xs:complexType>
  
  <xs:complexType name="Box_T">
    <xs:all>
      <xs:element name="Element" type="xs:string" minOccurs="1" maxOccurs="unbounded"/>
      <xs:element name="Box" type="Box_T" minOccurs="0" maxOccurs="1"/>
    </xs:all>
  </xs:complexType>

</xs:schema>

Я не проверял, действителен ли приведенный выше код, но думаю, что это определенно поможет вам начать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...