Вопрос

Я должен сделать схему для формата 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 " ;. Я попытался обернуть связанные пары тегов error / other в xsd: sequence, но это не сработало, потому что я все еще эффективно нарушаю правило уникальной атрибуции частиц.

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

Это было полезно?

Решение

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

  <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 " и первый " error " выше имеет maxOccurs > 1, тогда вы не выполняете правило уникальной атрибуции частиц, потому что проверка не может проверить, если у вас есть два элемента ошибки в строке, какой экземпляр & Quot; error & Quot; в схеме они принадлежат. Однако до тех пор, пока каждый экземпляр & Quot; error & Quot; может быть однозначно идентифицирован в схеме благодаря правильному использованию " minOccurs " и " maxOccurs " для элементов ошибок и для промежуточных элементов, тогда вы хороши.

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

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

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

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