忽略对xsd的xml验证中的元素顺序

时间:2010-06-03 14:52:38

标签: xml validation xsd

我处理电子邮件并在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 个答案:

答案 0 :(得分:4)

是的,有可能。只需创建一个选项(当然是某种类型或元素内容模型),并将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>

答案 1 :(得分:0)

首先,一些要求猜测:

  • “主题”是强制性的
  • 至少有一名“收件人”是强制性的

由于您只有两个不同的元素,因此很容易实现它:

<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>