Я должен создать схему для XML-файла, который довольно гибок. Это должно отвечать следующим требованиям:
Быстрый пример:
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 требования?
Ваше требование номер 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 вашего экземпляра документа ссылается на обе схемы.