QXmlSchemaValidator(Qt 4.8)是否支持XML模式(XSD)属性“substitutionGroup”

时间:2013-07-18 09:33:55

标签: xml qt xsd

QXmlSchemaValidator在包含substitutionGroups时不验证我的XML。在线工具(http://www.utilities-online.info/xsdvalidation/http://www.freeformatter.com/xml-validator-xsd.html)针对XSD验证XML,XSD和XML。

错误:

Error XSDError in file: (XML), at line 44, column 14: Element image_id is not defined in this scope.

相关代码,XSD:

  <xs:element name="image_ids" abstract="true"/>
  <xs:element name="image_id" type="xs:nonNegativeInteger" substitutionGroup="image_ids"/>
  <xs:element name="image_queue_id" type="xs:nonNegativeInteger" substitutionGroup="image_ids"/>

  <xs:element name="image_slot">  
    <xs:complexType>      
      <xs:all>
        <xs:element ref="image_ids" maxOccurs="1"/>
        <xs:element ref="caption" minOccurs="0" maxOccurs="1"/>
      </xs:all>
      <xs:attributeGroup ref="position"/>
    </xs:complexType>
  </xs:element>

相关代码,XML:

  <image_slot x="7" y="110" width="55">
    <image_id>0</image_id> <-- error
    <caption>some caption</caption>
  </image_slot>

QXmlSchemaValidator验证XSD,但不验证针对XSD的XML。摆脱substitutionGroup足以验证XML,但这也意味着我失去了功能 - 现在将验证不正确的XML文件。因此,我的问题是 - Qt实际上是否支持XML substitutionGroups,还有其他一些我做错了(其他工具没有注意到)?

或者它是QXmlSchemaValidator中的错误,在这种情况下我应该放弃这个想法并找到另一个解决方案?

编辑:必须等一天才能发布我自己的答案。我必须再等一天才能接受它。

1 个答案:

答案 0 :(得分:0)

事实证明,替换组的元素必须属于同一类型。在我的XSD中就是这种情况,但是类型是在组的每个元素中定义的,而不是在抽象元素级别。以下代码解决了该问题:

XDS代码:

  <xs:element name="image_ids" type="xs:nonNegativeInteger" abstract="true"/>
  <xs:element name="image_id" substitutionGroup="image_ids"/>
  <xs:element name="image_queue_id" substitutionGroup="image_ids"/>

  <xs:element name="image_slot">  
    <xs:complexType>      
      <xs:all>
        <xs:element ref="image_ids" maxOccurs="1"/>
          <xs:element ref="caption" minOccurs="0" maxOccurs="1"/>
        </xs:all>
      <xs:attributeGroup ref="position"/>
    </xs:complexType>
  </xs:element>

XML代码:

  <image_slot x="7" y="110" width="55">
    <image_id>0</image_id>
    <caption>some caption</caption>
  </image_slot>

我不确定为什么QXmlSchemaValidator仅验证模式以拒绝验证XML;希望这将有助于其他人面临同样的问题。