Создание 'гибкой' XML-схемы

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

  1. Проверьте некоторые элементы, которых мы требуем, чтобы присутствовать и знать точную структуру
  2. Проверьте некоторые элементы, которые являются дополнительными, и мы знаем точную структуру
  3. Позвольте любые другие элементы
  4. Позвольте им в любом порядке

Быстрый пример:

XML

<person>
    <age></age>
    <lastname></lastname>
    <height></height>
</person>

Моя попытка XSD:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="person">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="firstname" minOccurs="0" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Теперь мой XSD удовлетворяет требования 1 и 3. Это не действительная схема однако, если и firstname и lastname были дополнительными, таким образом, это не удовлетворяет требование 2, и порядок фиксируется, который приводит требование 4 к сбою.

Теперь все, в чем я нуждаюсь, является чем-то для проверки моего XML. Я открыт для предложений на любом способе сделать это, любой программно в.NET 3.5, другой тип схемы и т.д.

Кто-либо может думать о решении удовлетворить все 4 требования?

5
задан Fiona - myaccessible.website 7 April 2010 в 12:03
поделиться

1 ответ

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

Что касается проверки, вы не ограничены одной схемой. Если вас устраивает использование двух схем в разных пространствах имен, вы можете сделать это:

Схема первая - разрешить все:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="document">
    <xs:complexType>
      <xs:sequence>
        <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Схема два - добавить определенную проверку для некоторых элементов:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://other" xmlns="http://other">
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
</xs:schema>

Затем сделать убедитесь, что xsi: include вашего экземпляра документа ссылается на обе схемы.

6
ответ дан 14 December 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: