添加新复杂元素后QXmlSchemaValidator出现段错误
XML Schema 修改方案(解决QT验证段错误)
你的核心问题是XML Schema语法错误:直接在<xs:sequence>内部定义<xs:complexType>不符合Schema规范,这才导致QXmlSchemaValidator::validate()出现段错误。下面是正确的修改方案:
正确写法一:单独定义regulation类型再引用
先在Schema的合适位置(比如和startDefn同级)定义regulation的复杂类型,再在startDefn的序列中添加可选的regulation元素:
<!-- 先定义regulation的复杂类型 --> <xs:complexType name="regulationDefn"> <xs:sequence> <!-- 默认minOccurs="1",确保start和end必须同时存在 --> <xs:element ref="testsuite:start"/> <xs:element ref="testsuite:end"/> </xs:sequence> </xs:complexType> <!-- 修改后的startDefn --> <xs:complexType name="startDefn"> <xs:sequence> <xs:element ref="testsuite:obj"/> <xs:element minOccurs="0" ref="testsuite:starfile"/> <xs:element minOccurs="0" ref="testsuite:firfile"/> <xs:element minOccurs="0" ref="testsuite:funcfile"/> <!-- 添加可选的regulation元素,引用上面定义的类型 --> <xs:element name="regulation" type="testsuite:regulationDefn" minOccurs="0"/> </xs:sequence> </xs:complexType>
正确写法二:内嵌complexType到element中
如果不想单独定义regulationDefn,可以直接把complexType内嵌在regulation元素内部:
<xs:complexType name="startDefn"> <xs:sequence> <xs:element ref="testsuite:obj"/> <xs:element minOccurs="0" ref="testsuite:starfile"/> <xs:element minOccurs="0" ref="testsuite:firfile"/> <xs:element minOccurs="0" ref="testsuite:funcfile"/> <!-- 直接在element内部定义complexType --> <xs:element name="regulation" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element ref="testsuite:start"/> <xs:element ref="testsuite:end"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType>
错误原因说明
XML Schema的<xs:sequence>节点只允许包含element、group、choice、sequence等子节点,不能直接嵌套<xs:complexType>定义。你之前的写法违反了这个语法规则,导致Schema本身不合法,QT的验证器解析出错进而触发段错误。
上述两种写法都能满足你的需求:regulation元素是可选的(minOccurs="0"),一旦存在则必须同时包含start和end子元素(默认minOccurs="1",无需额外声明)。
内容的提问来源于stack exchange,提问作者Tyler Shellberg
相关产品推荐
相关产品推荐

