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

在针对xsd的xml验证中忽略元素顺序,xml,validation,xsd,Xml,Validation,Xsd,Ia处理电子邮件并在xml文档中保存一些标题。我还需要根据xml模式验证文档 正如主题所建议的,我需要验证忽略元素顺序,但就我所知,这似乎是不可能的。我说得对吗 如果我将标题放在中,那么顺序显然很重要。如果我告诉我们,则忽略顺序,但出于某种奇怪的原因,这意味着元素必须至少出现一次 我的xml是这样的: <headers> <subject>bla bla bla</subject> <recipient>rcp01@domain.com&l

Ia处理电子邮件并在xml文档中保存一些标题。我还需要根据xml模式验证文档

正如主题所建议的,我需要验证忽略元素顺序,但就我所知,这似乎是不可能的。我说得对吗

如果我将标题放在
中,那么顺序显然很重要。如果我告诉我们
,则忽略顺序,但出于某种奇怪的原因,这意味着元素必须至少出现一次

我的xml是这样的:

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

呜呜呜呜
rcp01@domain.com
rcp02domain.com
rcp..。@domain.com
但我认为即使主题元素和收件人元素被交换,最终文档也是有效的


真的没什么可做的吗?

是的,这是可能的。只需创建一个选项(当然是在某些类型或元素内容模型中),并将maxOccurs设置为unbounded

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

首先,一些需求猜测:

  • “主题”是强制性的
  • 必须至少有一个“收件人”
由于您只有两个不同的元素,因此很容易实现:

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


@segolas,我可以看出此解决方案符合您的要求,请礼貌地接受此解决方案。我正在使用Netbeans,使用此解决方案会给我带来一些错误,我正试图找出原因。所以,现在我不知道这个答案是否有效!哼我认为这是可行的,但现在jaxb生成了一个方法getSubjectOrRecipient(),而不是getSubject()和getRecipient()。根据“XMLSchemaChoice元素只允许声明中包含的一个元素出现在包含元素中。”因此,我似乎只能在headers元素中包含subject或recipient。。。我说的对吗?嗨,塞戈拉斯;仅供参考,如果您使用的是JAXB,那么一旦您创建了一个无界序列或无界选择(而不是其中的无界元素),JAXB就会被迫生成这个中间方法以正确反映重复选择。但是,无论如何:您可以根据需要重复这些元素。每个选项只能有一个,是的,但选项本身是可重复的:)好的,明白了。只有一件事,我想要和,没有这两个标记之一的xml应该是无效的。是这样吗?也许我可以尝试使用minOccurs=1?不幸的是,我只发布了一个xml示例,事实上我有很多元素。我理解您的解决方案,但我认为这会降低我的模式的可读性,并且有点难以维护。。。