2011-05-26 40 views
0

从基于年份的演变XSD/XML开始,我想写一个更简单的XSD,只定位不会被修改或删除的元素,它可以验证XML来自完整的XSD。XSD名称 - 具有已知名称的可选元素的未知可选元素

为了使简单:

有了这个XML:

<root> 
    <unknown1/> 
    <known2/> 
    <unknown2/> 
    <known1/> 
    <unknown3/> 
    <unknown4/> 
</root> 

这XSD:

<xsd:schema> 
    <xsd:element name="root"> 
     <xsd:all> 
      <xsd:element name="unknown1" minOccurs="0"/> 
      <xsd:element name="unknown2" minOccurs="0"/> 
      <xsd:element name="unknown3" minOccurs="0"/> 
      <xsd:element name="unknown4" minOccurs="0"/> 
      <xsd:element name="known1" minOccurs="0"/> 
      <xsd:element name="known2" minOccurs="0"/> 
     </xsd:all> 
    </xsd:element name="root"> 
</xsd:schema> 

我想要的东西,如:

<xsd:schema> 
    <xsd:all> 
     <xsd:any processControl="skip" /> 
     <xsd:element name="known1" /> 
     <xsd:element name="known2" /> 
</xsd:schema> 

这XSD无效为xsd:any只能出现在xsd:sequencexsd:choice

我不知道如何可以验证原始XML文件具有类似的简单XSD

回答

0

您可以known1,2的xs:choicexs:any,并设置maxOccursunbounded

编辑:这仍然只处理可选的情况下,但我意识到你不需要嵌入xs:choicexs:sequence

+0

以及如果我没有知识1和/或知识2的XML?这将验证,这将是错误的 – shubakk 2011-05-26 12:57:12

+0

so known1,known2是必需的,但其余是可选的?标题说“名称未知的可选元素与名称已知的可选元素”,所以我很困惑。 – 2011-05-26 13:54:31

+0

我的歉意,他们是可选的。你会用非可选元素推荐什么? 即使使用可选元素,如果我知道了1&known2加上额外的元素(例如unknown1),那么它也不会做正确的事情 – shubakk 2011-05-26 14:02:38

0

这里是一个工作模式,其允许

  • 自由顺序<known1><known2>元件
  • 省略<known1><known2>(或两者)
  • 任何其它元件的无限量之间之前,之后,或在之间他们

请注意,您必须将<xs:any>所允许的元素限制为某些其他命名空间不是<known1><known2>。否则架构将变得毫无疑义,因为<xs:any>也将允许<known1><known2>。另外需要注意的是,我们需要在<xs:choice><xs:sequence>上设置minOccurs属性,以保持架构的确定性。

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
     <xs:choice minOccurs="0"> 
      <xs:sequence> 
      <xs:element name="known1" /> 
      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      <xs:sequence minOccurs="0"> 
       <xs:element name="known2" /> 
       <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      </xs:sequence> 
      </xs:sequence> 
      <xs:sequence> 
      <xs:element name="known2" /> 
      <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      <xs:sequence minOccurs="0"> 
       <xs:element name="known1" /> 
       <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="skip" /> 
      </xs:sequence> 
      </xs:sequence> 
     </xs:choice> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
相关问题