XSD 使用 QXMLSchema 时复杂类型中的模式问题
XSD schema issue in complextype when using QXMLSchema
我正在创建一个 XSD 模式来验证 XML 文件。
W3C XML Schema (XSD) Validation page 的模式是正确的,而 QXmlSchema 有错误。这是生成错误的最小 XSD 部分:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://standards.ieee.org/IEEE1516-2010" xmlns:ns="http://standards.ieee.org/IEEE1516-2010" targetNamespace="http://standards.ieee.org/IEEE1516-2010" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2010">
<xs:element name="objectModel" type="objectModelType">
</xs:element>
<xs:complexType name="objectModelType">
<xs:sequence>
<xs:element name="modelIdentification" type="modelIdentificationType">
<xs:annotation>
<xs:documentation>documents certain key identifying information within the object model description</xs:documentation>
</xs:annotation>
</xs:element>
<xs:any namespace="##other" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="modelIdentificationType">
<xs:sequence>
<xs:element name="name" type="NonEmptyString">
<xs:annotation>
<xs:documentation>specifies the name assigned to the object model</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="glyph" minOccurs="0">
<xs:annotation>
<xs:documentation>specifies a glyph to visually represent the model</xs:documentation>
</xs:annotation>
<xs:complexType mixed="true">
<xs:simpleContent>
<xs:extension base="glyphType"/>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" minOccurs="0"/>
</xs:sequence>
<xs:attributeGroup ref="commonAttributes"/>
</xs:complexType>
<xs:complexType name="String">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attributeGroup ref="commonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="NonEmptyString">
<xs:simpleContent>
<xs:extension base="nonEmptyString">
<xs:attributeGroup ref="commonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="glyphType" mixed="true">
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
<xs:attributeGroup ref="commonAttributes"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="type" type="glyphTypeUnion"/>
<xs:attribute name="height" type="xs:short"/>
<xs:attribute name="width" type="xs:short"/>
<xs:attribute name="alt" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="IdentifierType">
<xs:simpleContent>
<xs:extension base="xs:NCName">
<xs:attributeGroup ref="commonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="nonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="glyphTypeUnion">
<xs:union memberTypes="glyphTypeEnumerations xs:string"/>
</xs:simpleType>
<xs:simpleType name="glyphTypeEnumerations">
<xs:restriction base="xs:string">
<xs:enumeration value="BITMAP"/>
<xs:enumeration value="JPG"/>
<xs:enumeration value="GIF"/>
<xs:enumeration value="PNG"/>
<xs:enumeration value="TIFF"/>
</xs:restriction>
</xs:simpleType>
<xs:attributeGroup name="commonAttributes">
<xs:attribute name="notes" type="xs:IDREFS" use="optional"/>
<xs:attribute name="idtag" type="xs:ID" use="optional"/>
<xs:anyAttribute namespace="##other"/>
</xs:attributeGroup>
</xs:schema>
如果我将此架构复制并粘贴到 W3C 页面,它说没问题。
我以这种方式在我的程序中创建模式:
QXmlSchema schema;
// text is a char array containing the XML file.
schema.load(text);
当我调用 load
方法时,调试控制台中出现以下消息 window:
Error XSDError in Unknown location, at line 52, column 22: complexType element with simpleContent child element must not have a mixed attribute.
如果我转到消息中显示的行号,我可以看到 complexType 是以下一个:
<xs:complexType name="glyphType" mixed="true">
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
<xs:attributeGroup ref="commonAttributes"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="type" type="glyphTypeUnion"/>
<xs:attribute name="height" type="xs:short"/>
<xs:attribute name="width" type="xs:short"/>
<xs:attribute name="alt" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
看到 XSD 的这一部分,错误消息对我来说似乎很清楚,但我不知道为什么这应该是一个错误。
所以对于 W3C 页面这是正确的,对于 Qt 是错误的。哪一个对内容简单的复杂类型的解释正确?
这是应该验证的 XML 的最小示例(在网页中):
<?xml version="1.0" encoding="utf-8"?>
<objectModel xmlns="http://standards.ieee.org/IEEE1516-2010" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://standards.ieee.org/IEEE1516-2010 http://standards.ieee.org/downloads/1516/1516.2-2010/IEEE1516-DIF-2010.xsd">
<modelIdentification>
<name>New</name>
</modelIdentification>
</objectModel>
Simple content 表示元素只包含文本(字符数据),mixed 表示元素可以包含文本和子元素的混合,所以两者都是矛盾的。
撒克逊拒绝它:
Error at xs:complexType on line 2 column 51 of test.xsd:
The <complexType> must not specify mixed='true' when <simpleContent> is present
我在 XSD 1.0 §3.4.3
中找到了这条注释
注:尽管此处或在 Schema for Schemas(规范)(§A) 中均未明确排除,但在选择 <simpleContent>
替代方案时指定 <xs:complexType . . .mixed='true'
没有对相应组件的影响,应避免。这可能会在本规范的后续版本中被排除。
所以这是胡说八道,强烈建议不要这样做,但根据 XSD 1.0.
实际上似乎并不违法
XSD 1.1 使其非法:§3.4.3 第 1 条:如果选择了 <simpleContent>
选项,<complexType>
元素不得有 mixed = true
.
我正在创建一个 XSD 模式来验证 XML 文件。
W3C XML Schema (XSD) Validation page 的模式是正确的,而 QXmlSchema 有错误。这是生成错误的最小 XSD 部分:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://standards.ieee.org/IEEE1516-2010" xmlns:ns="http://standards.ieee.org/IEEE1516-2010" targetNamespace="http://standards.ieee.org/IEEE1516-2010" elementFormDefault="qualified" attributeFormDefault="unqualified" version="2010">
<xs:element name="objectModel" type="objectModelType">
</xs:element>
<xs:complexType name="objectModelType">
<xs:sequence>
<xs:element name="modelIdentification" type="modelIdentificationType">
<xs:annotation>
<xs:documentation>documents certain key identifying information within the object model description</xs:documentation>
</xs:annotation>
</xs:element>
<xs:any namespace="##other" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="modelIdentificationType">
<xs:sequence>
<xs:element name="name" type="NonEmptyString">
<xs:annotation>
<xs:documentation>specifies the name assigned to the object model</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="glyph" minOccurs="0">
<xs:annotation>
<xs:documentation>specifies a glyph to visually represent the model</xs:documentation>
</xs:annotation>
<xs:complexType mixed="true">
<xs:simpleContent>
<xs:extension base="glyphType"/>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:any namespace="##other" minOccurs="0"/>
</xs:sequence>
<xs:attributeGroup ref="commonAttributes"/>
</xs:complexType>
<xs:complexType name="String">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attributeGroup ref="commonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="NonEmptyString">
<xs:simpleContent>
<xs:extension base="nonEmptyString">
<xs:attributeGroup ref="commonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="glyphType" mixed="true">
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
<xs:attributeGroup ref="commonAttributes"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="type" type="glyphTypeUnion"/>
<xs:attribute name="height" type="xs:short"/>
<xs:attribute name="width" type="xs:short"/>
<xs:attribute name="alt" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="IdentifierType">
<xs:simpleContent>
<xs:extension base="xs:NCName">
<xs:attributeGroup ref="commonAttributes"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name="nonEmptyString">
<xs:restriction base="xs:string">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="glyphTypeUnion">
<xs:union memberTypes="glyphTypeEnumerations xs:string"/>
</xs:simpleType>
<xs:simpleType name="glyphTypeEnumerations">
<xs:restriction base="xs:string">
<xs:enumeration value="BITMAP"/>
<xs:enumeration value="JPG"/>
<xs:enumeration value="GIF"/>
<xs:enumeration value="PNG"/>
<xs:enumeration value="TIFF"/>
</xs:restriction>
</xs:simpleType>
<xs:attributeGroup name="commonAttributes">
<xs:attribute name="notes" type="xs:IDREFS" use="optional"/>
<xs:attribute name="idtag" type="xs:ID" use="optional"/>
<xs:anyAttribute namespace="##other"/>
</xs:attributeGroup>
</xs:schema>
如果我将此架构复制并粘贴到 W3C 页面,它说没问题。
我以这种方式在我的程序中创建模式:
QXmlSchema schema;
// text is a char array containing the XML file.
schema.load(text);
当我调用 load
方法时,调试控制台中出现以下消息 window:
Error XSDError in Unknown location, at line 52, column 22: complexType element with simpleContent child element must not have a mixed attribute.
如果我转到消息中显示的行号,我可以看到 complexType 是以下一个:
<xs:complexType name="glyphType" mixed="true">
<xs:simpleContent>
<xs:extension base="xs:base64Binary">
<xs:attributeGroup ref="commonAttributes"/>
<xs:attribute name="href" type="xs:anyURI"/>
<xs:attribute name="type" type="glyphTypeUnion"/>
<xs:attribute name="height" type="xs:short"/>
<xs:attribute name="width" type="xs:short"/>
<xs:attribute name="alt" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
看到 XSD 的这一部分,错误消息对我来说似乎很清楚,但我不知道为什么这应该是一个错误。
所以对于 W3C 页面这是正确的,对于 Qt 是错误的。哪一个对内容简单的复杂类型的解释正确?
这是应该验证的 XML 的最小示例(在网页中):
<?xml version="1.0" encoding="utf-8"?>
<objectModel xmlns="http://standards.ieee.org/IEEE1516-2010" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://standards.ieee.org/IEEE1516-2010 http://standards.ieee.org/downloads/1516/1516.2-2010/IEEE1516-DIF-2010.xsd">
<modelIdentification>
<name>New</name>
</modelIdentification>
</objectModel>
Simple content 表示元素只包含文本(字符数据),mixed 表示元素可以包含文本和子元素的混合,所以两者都是矛盾的。
撒克逊拒绝它:
Error at xs:complexType on line 2 column 51 of test.xsd:
The <complexType> must not specify mixed='true' when <simpleContent> is present
我在 XSD 1.0 §3.4.3
中找到了这条注释注:尽管此处或在 Schema for Schemas(规范)(§A) 中均未明确排除,但在选择 <simpleContent>
替代方案时指定 <xs:complexType . . .mixed='true'
没有对相应组件的影响,应避免。这可能会在本规范的后续版本中被排除。
所以这是胡说八道,强烈建议不要这样做,但根据 XSD 1.0.
实际上似乎并不违法XSD 1.1 使其非法:§3.4.3 第 1 条:如果选择了 <simpleContent>
选项,<complexType>
元素不得有 mixed = true
.