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中的错误,在这种情况下我应该放弃这个想法并找到另一个解决方案?
编辑:必须等一天才能发布我自己的答案。我必须再等一天才能接受它。
答案 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;希望这将有助于其他人面临同样的问题。