ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

XML Schema 杂项数据类型详解:从 anyType 到 notation

XML Schema 杂项数据类型详解:从 anyType 到 notation 1. 引言XML SchemaXSD除了提供 string、int、date 等常见数据类型外还定义了一组「杂项数据类型」。这些类型虽然使用频率不如基础类型高但在处理复杂业务场景、扩展性设计和元数据描述时往往不可或缺。本文围绕 XML Schema 中的杂项数据类型展开重点介绍 anyType、anySimpleType、anyURI、QName、NOTATION、ID/IDREF/IDREFS、ENTITY/ENTITIES、NMTOKEN/NMTOKENS 等类型的定义、用途和典型代码示例。2. 杂项数据类型概览XML Schema 规范将数据类型分为「内置类型」和「用户自定义类型」两大类。杂项数据类型主要分布在内置类型体系中它们通常用于描述「不确定类型」「引用关系」「名称空间限定」或「外部资源定位」等特殊语义。下面先给出一个整体分类表类型所属类别典型用途anyType根类型任意 XML 内容所有类型的基类anySimpleType简单类型根任意简单类型值的统称anyURI内置简单类型URI 引用如链接、命名空间地址QName内置简单类型带命名空间限定的名称NOTATION内置简单类型引用 DTD 中声明的记号ID / IDREF / IDREFS内置简单类型文档内唯一标识与交叉引用ENTITY / ENTITIES内置简单类型引用未解析实体NMTOKEN / NMTOKENS内置简单类型名称记号及名称记号列表3. anyType 与 anySimpleTypeanyType 是 XML Schema 类型体系的根类型所有数据类型包括内置类型和自定义类型都直接或间接派生自它。anyType 可以描述任意 XML 内容包括元素、属性、文本以及它们的任意组合。与之相对anySimpleType 是所有简单类型的根只能描述不含子元素的文本内容。下面通过一个示例展示如何使用 anyType 描述「不确定结构」的字段?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:element namemessage typexs:anyType/ /xs:schema上面的 schema 允许 message 元素承载任意内容。下面给出两个合法的 XML 实例!-- 实例一纯文本内容 -- messageHello, XML Schema!/message !-- 实例二带子元素和属性的复杂内容 -- message priorityhigh title系统告警/title body磁盘使用率超过 90%。/body /message再看 anySimpleType 的用法。anySimpleType 适合声明「值类型暂时未定」的属性或元素后续可以通过替换组或派生类型进一步约束xs:element namevalue typexs:anySimpleType/对应的合法实例可以是字符串、数字或日期valuehello/value value42/value value2026-08-07/value4. anyURI 类型anyURI 用于表示 URI 引用包括绝对 URI、相对 URI 以及 URI 片段。它常用于描述链接地址、命名空间位置、样式表引用等场景。anyURI 的值必须符合 RFC 3986 定义的 URI 语法。下面定义一个包含 anyURI 属性的 schema?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:element namedocument xs:complexType xs:sequence xs:element nametitle typexs:string/ xs:element namesource typexs:anyURI/ xs:element namethumbnail typexs:anyURI/ /xs:sequence /xs:complexType /xs:element /xs:schema对应的 XML 实例document titleXML Schema 指南/title sourcehttps://example.com/spec/xml-schema.pdf/source thumbnailimages/cover.png/thumbnail /document需要注意的是anyURI 只做语法层面的校验不会自动检查 URI 是否真实可访问。相对路径和绝对路径都合法空格等非法字符会被判定为无效。5. QName 类型QNameQualified Name表示带命名空间限定的名称格式为「前缀:本地名」或仅「本地名」。QName 在描述「引用其他 schema 组件」「表示 XML 元素或属性名称」等场景中非常有用。下面示例展示如何在 schema 中使用 QName 描述「目标类型」?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xmlns:apphttp://www.example.com/app xs:element namefield xs:complexType xs:sequence xs:element namename typexs:string/ xs:element nametypeRef typexs:QName/ /xs:sequence /xs:complexType /xs:element /xs:schema对应的 XML 实例field xmlns:apphttp://www.example.com/app nameuserName/name typeRefapp:UserType/typeRef /field在上面的实例中typeRef 的值 app:UserType 是一个 QName其中 app 前缀必须在实例文档中完成命名空间声明否则校验会失败。6. NOTATION 类型NOTATION 类型用于引用 DTD 中声明的记号Notation。记号通常用来标识外部二进制数据的格式例如图片格式、音频格式等。由于 NOTATION 依赖 DTD 声明实际使用中需要同时维护 DTD 和 XSD 两套约束。首先在 DTD 中声明记号!NOTATION gif SYSTEM image/gif !NOTATION jpeg SYSTEM image/jpeg然后在 XSD 中定义基于 NOTATION 的枚举类型?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:simpleType nameimageFormat xs:restriction basexs:NOTATION xs:enumeration valuegif/ xs:enumeration valuejpeg/ /xs:restriction /xs:simpleType xs:element nameimage xs:complexType xs:sequence xs:element nameformat typeimageFormat/ xs:element nameurl typexs:anyURI/ /xs:sequence /xs:complexType /xs:element /xs:schema对应的 XML 实例image formatgif/format urlhttps://example.com/logo.gif/url /image7. ID、IDREF 与 IDREFS 类型ID、IDREF 和 IDREFS 用于在 XML 文档内部建立唯一标识和交叉引用关系。ID 类型的值在整个文档中必须唯一IDREF 引用文档中某个已存在的 IDIDREFS 则是多个 IDREF 组成的空白分隔列表。下面定义一个「员工-部门」引用关系的 schema?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:element namecompany xs:complexType xs:sequence xs:element namedepartment maxOccursunbounded xs:complexType xs:sequence xs:element namename typexs:string/ xs:element nameemployee maxOccursunbounded xs:complexType xs:sequence xs:element nameempName typexs:string/ /xs:sequence xs:attribute nameempId typexs:ID userequired/ xs:attribute namemanagerRef typexs:IDREF/ xs:attribute namepeerRefs typexs:IDREFS/ /xs:complexType /xs:element /xs:sequence xs:attribute namedeptId typexs:ID userequired/ /xs:complexType /xs:element /xs:sequence /xs:complexType /xs:element /xs:schema对应的 XML 实例company department deptIdd1 name研发部/name employee empIde1 empName张三/empName /employee employee empIde2 managerRefe1 peerRefse3 empName李四/empName /employee employee empIde3 empName王五/empName /employee /department /company在上面的实例中e2 的 managerRef 指向 e1peerRefs 指向 e3。如果引用了不存在的 ID校验会失败。8. ENTITY 与 ENTITIES 类型ENTITY 类型用于引用 DTD 中声明的未解析实体Unparsed Entity通常配合 NOTATION 描述外部二进制资源。ENTITIES 则是多个 ENTITY 组成的空白分隔列表。首先在 DTD 中声明未解析实体!ENTITY logo SYSTEM logo.gif NDATA gif !ENTITY banner SYSTEM banner.jpg NDATA jpeg然后在 XSD 中定义使用 ENTITY 和 ENTITIES 的元素?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:element namepage xs:complexType xs:sequence xs:element namemainImage typexs:ENTITY/ xs:element nameadImages typexs:ENTITIES/ /xs:sequence /xs:complexType /xs:element /xs:schema对应的 XML 实例page mainImagelogo/mainImage adImagesbanner logo/adImages /page9. NMTOKEN 与 NMTOKENS 类型NMTOKENName Token表示由名称字符组成的记号不能包含空白字符但可以包含字母、数字、连字符、下划线、点号等。NMTOKENS 是多个 NMTOKEN 组成的空白分隔列表。NMTOKEN 常用于表示枚举值、标识符或代码值。下面定义一个使用 NMTOKEN 和 NMTOKENS 的 schema?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:element nameproduct xs:complexType xs:sequence xs:element namesku typexs:NMTOKEN/ xs:element nametags typexs:NMTOKENS/ /xs:sequence /xs:complexType /xs:element /xs:schema对应的 XML 实例product skuSKU-2026-001/sku tagselectronics portable discount/tags /product如果 tags 中出现连续多个空格校验时会被视为多个 NMTOKEN 之间的分隔符但如果某个值本身包含空格则校验失败。10. 综合实战订单消息中的杂项类型下面通过一个综合示例把本文介绍的多种杂项数据类型组合到同一个订单消息模型中。?xml version1.0 encodingUTF-8? xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xmlns:ordhttp://www.example.com/order xs:element nameorder xs:complexType xs:sequence xs:element nameorderId typexs:ID/ xs:element namecustomerRef typexs:IDREF/ xs:element namecallbackUrl typexs:anyURI/ xs:element nameorderType typeord:orderType/ xs:element namemetadata typexs:anyType/ xs:element nameattachments typexs:ENTITIES/ /xs:sequence /xs:complexType /xs:element xs:simpleType nameorderType xs:restriction basexs:NMTOKEN xs:enumeration valuenormal/ xs:enumeration valueexpress/ xs:enumeration valuescheduled/ /xs:restriction /xs:simpleType /xs:schema对应的 XML 实例order xmlns:ordhttp://www.example.com/order xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance orderIdo1001/orderId customerRefc2001/customerRef callbackUrlhttps://api.example.com/order/callback/callbackUrl orderTypeexpress/orderType metadata sourcemobile-app/source priorityhigh/priority /metadata attachmentsinvoice receipt/attachments /order在这个综合示例中orderId 使用 ID 保证唯一性customerRef 通过 IDREF 引用客户 IDcallbackUrl 使用 anyURI 描述回调地址orderType 基于 NMTOKEN 做枚举约束metadata 使用 anyType 承载灵活扩展信息attachments 使用 ENTITIES 引用外部单据实体。11. 常见问题与注意事项anyType 与 anySimpleType 的区别anyType 可以包含子元素和属性anySimpleType 只能包含文本值。需要承载复杂结构时使用 anyType仅需宽松文本值时使用 anySimpleType。ID 的唯一性范围ID 值在整个 XML 文档中必须唯一不能跨文档共享。ID 值不能以数字开头。IDREF 的引用校验IDREF 引用的目标必须在同一文档内存在对应的 ID否则校验失败。IDREFS 中的每个引用都必须有效。QName 的命名空间声明QName 值中使用的前缀必须在实例文档中声明对应的命名空间否则无法解析。NOTATION 与 ENTITY 的依赖这两类类型依赖 DTD 中的声明使用前需要确保 DTD 与 XSD 同时维护避免声明缺失导致校验失败。NMTOKEN 不能包含空白NMTOKEN 值内部不能有空格多个值需要使用 NMTOKENS 并通过空白分隔。anyURI 只做语法校验anyURI 不会检查链接是否真实可达业务层面需要自行验证资源有效性。12. 总结XML Schema 的杂项数据类型虽然不像 string、int 那样高频使用但在处理引用关系、外部资源、灵活扩展和命名空间限定等场景中具有不可替代的作用。anyType 和 anySimpleType 提供了类型体系的弹性anyURI 和 QName 解决了资源定位与名称限定问题ID/IDREF/IDREFS 构建了文档内部的引用网络NOTATION 与 ENTITY 打通了与 DTD 外部资源的衔接NMTOKEN/NMTOKENS 则提供了轻量级的名称记号约束。在实际建模时建议根据业务语义选择合适的杂项类型并注意它们各自的校验规则和依赖条件从而构建既严谨又灵活的 XML Schema。
返回列表