2

当 QXmlSchemaValidator 包含替代组时,它不会验证我的 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。摆脱替代组足以验证 XML,但这也意味着我失去了功能 - 现在将验证不正确的 XML 文件。因此我的问题是——Qt 是否真的支持 XML 替换组,还有我做错了什么(其他工具没有注意到)?

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

编辑:不得不等待一天才能发布我自己的答案。我得再等一天才能接受。

4

1 回答 1

1

事实证明,一个替换组的元素必须是相同的类型。我的 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;希望这将帮助其他面临同样问题的人。

于 2013-07-19T07:40:23.300 回答