XML-схема - обойти ограничение уникального тега - PullRequest
1 голос
/ 23 января 2009

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

Вот пример, похожий на нашу структуру XML:

<data>
    <summary>some info</summary>
    <error>error message (only if there was an error)</error>
    <details>more info
        <x>more</x>
        <y>even more</y>
    </details>
    <error>another error message</error>
    <z>some extra info</z>
</data>

Обратите внимание, что тег ошибки используется повторно на том же уровне и идет после определенных элементов, но не для других, поэтому я не могу просто установить maxOccurs = "unbounded". Я попытался обернуть связанные пары ошибок / других тегов в последовательность xsd:, но это не сработало, потому что я все еще эффективно нарушаю правило уникальной атрибуции частиц.

Можно ли это сделать, или мне нужно сообщить другим разработчикам, что эта схема не будет проверяться?

1 Ответ

2 голосов
/ 23 января 2009

Мое чтение стандарта XML-схемы говорит о том, что вы, вероятно, в безопасности. Вы просто определяете непоследовательные элементы с одинаковыми именами в своей схеме, чтобы отразить XML, каким он будет (или может быть) сгенерирован. Пока все "ошибки" экземпляров всегда разделены другими элементами и не являются последовательными, это не должно быть проблемой. Например, что-то вроде:

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="error" type="xs:string"/>

  <xs:complexType name="detailsType">
    ....
  </xs:complexType>

Если детали имеют minOccurs = "0", а первая вышеупомянутая "ошибка" имеет maxOccurs> 1, то вы не выполняете правило уникального атрибута частиц, поскольку проверка не может проверить, если у вас есть два элемента ошибки в строке, какой экземпляр «ошибки» в схеме, к которой они принадлежат. Однако до тех пор, пока каждый экземпляр «ошибки» может быть однозначно идентифицирован в схеме, благодаря хорошему использованию «minOccurs» и «maxOccurs» для элементов ошибок и промежуточных элементов, вы хороши.

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

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

РЕДАКТИРОВАТЬ: Обновлено, чтобы отразить правки в исходном вопросе.

...