игнорирование порядка элементов в проверке xml против xsd - PullRequest
2 голосов
/ 03 июня 2010

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

Как предполагает субъект, мне нужно проверить игнорирование порядка элементов, но, насколько я понимаю, это кажется невозможным. Я прав?

Если я помещу заголовки в <xsd:sequence>, порядок, очевидно, имеет значение. Если я <xsd:all>, то порядок игнорируется, но по какой-то странной причине это означает, что элементы должны встречаться хотя бы один раз.

Мой xml выглядит примерно так:

<headers>
  <subject>bla bla bla</subject>
  <recipient>rcp01@domain.com</recipient>
  <recipient>rcp02domain.com</recipient>
  <recipient>rcp...@domain.com</recipient>
</headers>

но я думаю, что окончательный документ действителен, даже если элементы субъекта и получателя поменялись местами.

Неужели тут нечего делать?

Ответы [ 2 ]

4 голосов
/ 05 июня 2010

Да, это возможно. Просто создайте выбор (в некотором типе или модели содержимого элемента, конечно) с maxOccurs, установленным в неограниченный.

<xs:element name="headers">
    <xs:complexType>
        <xs:choice maxOccurs="unbounded">
            <xs:element name="subject" type="xs:string"/>
            <xs:element name="recipient" type="xs:string"/>
        </xs:choice>
    </xs:complexType>
</xs:element>
0 голосов
/ 07 июня 2010

Во-первых, угадать некоторые требования:

  • "предмет" обязателен
  • По крайней мере один "получатель" обязателен

Поскольку у вас есть только два разных элемента, это очень легко сделать:

<xs:element name="headers">
<xs:complexType>
 <xs:choice>
   <xs:sequence><!-- The recipient MUST be after the subject -->         
     <xs:element name="subject" type="xs:string" />
     <xs:element name="recipient" minOccurs="1" maxOccurs="unbound" type="xs:string" />
   </xs:sequence>
   <xs:sequence><!-- The recipient is before the subject -->          
     <xs:element name="recipient" minOccurs="1" maxOccurs="unbound" type="xs:string" />
     <xs:element name="subject" type="xs:string" />
     <xs:element name="recipient" minOccurs="0" maxOccurs="unbound" type="xs:string" />
   </xs:sequence>
 </xs:choice>
</xs:complexType>
</xs:element>
...