当前位置: 首页 > news >正文

XML Schema 字符串数据类型详解

1. 引言

XML Schema(XSD)是定义 XML 文档结构和数据类型的标准语言。在 XML Schema 中,字符串数据类型是最基础、最常用的类型之一。本文将从内置字符串类型、派生类型、约束限制以及实际应用等方面,详细介绍 XML Schema 中的字符串数据类型,并提供丰富的代码实例。

2. 内置字符串类型

XML Schema 提供了多种内置的字符串相关数据类型,它们都派生自xs:string。下表列出了常用的内置字符串类型:

类型说明示例
xs:string任意长度的字符串Hello World
xs:normalizedString空白符被规范化的字符串Hello World
xs:token空白符被压缩的字符串Hello World
xs:language语言标识符zh-CN
xs:NMTOKEN名称记号item-01
xs:NameXML 名称elementName
xs:NCName不带命名空间的 XML 名称localName
xs:ID唯一标识符id-001
xs:IDREF引用标识符id-001

3. 基础字符串类型详解

下面通过一个完整的 XSD 示例来演示xs:stringxs:normalizedStringxs:token的区别。

首先定义一个 XSD 文件:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="book"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element name="publisher" type="xs:normalizedString"/> <xs:element name="isbn" type="xs:token"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

对应的合法 XML 实例:

<?xml version="1.0" encoding="UTF-8"?> <book> <title>XML 入门与实践</title> <publisher> 清华大学出版社 </publisher> <isbn> 978-7-302-12345-6 </isbn> </book>

需要注意:xs:string会保留所有空白字符;xs:normalizedString会将换行符、制表符替换为空格,但保留连续空格;xs:token会进一步压缩连续空格并去除首尾空格。

4. 使用 facet 约束字符串

XML Schema 提供了多种约束(facet)来限制字符串的长度和取值。常用的约束包括lengthminLengthmaxLengthpatternenumeration

4.1 长度约束

下面的示例演示如何使用lengthminLengthmaxLength约束字符串长度:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 用户名:长度必须为 6 到 20 个字符 --> <xs:element name="username"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="6"/> <xs:maxLength value="20"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 国家代码:长度必须恰好为 2 个字符 --> <xs:element name="countryCode"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="2"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>

4.2 模式约束(pattern)

pattern使用正则表达式来约束字符串的格式。下面的示例演示如何验证邮箱、手机号和邮政编码:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 邮箱地址 --> <xs:element name="email"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 中国大陆手机号 --> <xs:element name="phone"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="1[3-9][0-9]{9}"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- 邮政编码:6 位数字 --> <xs:element name="zipCode"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[0-9]{6}"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>

4.3 枚举约束(enumeration)

enumeration用于限定字符串只能取指定的几个值。下面的示例定义了一个表示性别的类型:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="gender"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="male"/> <xs:enumeration value="female"/> <xs:enumeration value="other"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>

5. 自定义字符串类型

在实际项目中,通常会将常用的字符串约束定义为全局简单类型,以便在多个元素中复用。下面的示例定义了一个通用的「非空字符串」类型和一个「URL 类型」:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 非空字符串:去除首尾空白后长度至少为 1 --> <xs:simpleType name="nonEmptyString"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:whiteSpace value="collapse"/> </xs:restriction> </xs:simpleType> <!-- URL 类型 --> <xs:simpleType name="urlType"> <xs:restriction base="xs:string"> <xs:pattern value="https?://[a-zA-Z0-9.-]+(\.[a-zA-Z]{2,})+(/[a-zA-Z0-9._~:/?#\[\]@!$&'()*+,;=%-]*)*"/> </xs:restriction> </xs:simpleType> <xs:element name="user"> <xs:complexType> <xs:sequence> <xs:element name="name" type="nonEmptyString"/> <xs:element name="blog" type="urlType"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

6. 字符串类型在复杂类型中的应用

字符串类型不仅可以用于简单元素,还可以作为复杂类型中属性的类型。下面的示例演示了如何在复杂类型中使用字符串类型和属性:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="product"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="description" type="xs:string" minOccurs="0"/> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="required"/> <xs:attribute name="category" type="xs:token"/> </xs:complexType> </xs:element> </xs:schema>

对应的 XML 实例:

<?xml version="1.0" encoding="UTF-8"?> <product id="p-001" category="electronics"> <name>无线鼠标</name> <description>2.4G 无线连接,静音按键</description> </product>

7. 空白处理(whiteSpace)

whiteSpacefacet 用于控制处理器对空白字符的处理方式,取值包括preservereplacecollapse。下面的示例演示三种模式的区别:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- preserve:原样保留空白 --> <xs:element name="preserveText"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="preserve"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- replace:将制表符、换行符替换为空格 --> <xs:element name="replaceText"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="replace"/> </xs:restriction> </xs:simpleType> </xs:element> <!-- collapse:压缩连续空格并去除首尾空格 --> <xs:element name="collapseText"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:whiteSpace value="collapse"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:schema>

8. 综合示例:用户注册信息

下面给出一个综合示例,将前面介绍的各种字符串约束组合起来,定义一个用户注册信息的 Schema:

<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="registration"> <xs:complexType> <xs:sequence> <xs:element name="username"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z][a-zA-Z0-9_]{5,19}"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="password"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="8"/> <xs:maxLength value="32"/> <xs:pattern value="(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).*"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="email"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="country"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:length value="2"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="bio" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>

对应的合法 XML 实例:

<?xml version="1.0" encoding="UTF-8"?> <registration> <username>zhang_san</username> <password>Abc12345</password> <email>zhangsan@example.com</email> <country>CN</country> <bio>专注于 XML 和 Web 技术。</bio> </registration>

9. 总结

XML Schema 的字符串数据类型体系非常丰富,从基础的xs:string到各种派生类型,再到通过 facet 实现的自定义约束,能够满足绝大多数文本数据的校验需求。在实际开发中,建议优先使用xs:token处理不需要保留空白的文本,使用pattern校验格式化的字符串(如邮箱、手机号),并使用enumeration限定取值范围。合理运用这些特性,可以显著提升 XML 数据的规范性和可靠性。

http://www.jsqmd.com/news/1392698/

相关文章:

  • 2026年GIS三维软件公司推荐:这几家口碑好且专业 - 选型|行业|价格|案例
  • 别再翻页截图了:GetQzonehistory让QQ空间历史说说备份一次搞定
  • 合肥蜀山区楼顶漏水怎么解决?2026 专业防水公司分享卫生间、楼顶、外墙、阳台 + 阳光房渗漏专业解决方案,一站式解决房屋漏水难题 - 超人防水
  • fSpy-Blender 终极拆解:一张照片如何在几分钟内重建出透视精准的 3D 场景
  • 2026年拍卖平台行业发展白皮书 和拍网运营体系详解 - 起跑123
  • 眉山电脑回收哪家靠谱?先看这几点资质口碑判断心里有底 - 官方资讯
  • Agent 评测的数据飞轮:如何把 Good Case 和 Bad Case 变成回归资产
  • 被会员墙、广告弹窗、强制登录折磨了三年,这款开源下载工具让我彻底卸载了某雷
  • 2026年工业水处理药剂价格选型分析:代表性品牌推荐与趋势指南 - 全域品牌推荐
  • 2026 河北拍摄剪辑教学实体店短视频制作学习攻略 - 中国华商产业观察网
  • 深度 | Rubin Ultra 双芯重构:CoWoS-L 翘曲如何逼 NVIDIA 放弃 1TB 旗舰
  • 2026年,口碑好的成都整厂设备回收服务商揭秘! - 甄选测评馆
  • 对标 Claude Cowork:DeepSeek Harness 公测,同步开放插件生态
  • 同样克重黄金,天津有人多赚上千!2026交易逻辑很多人没弄懂 - 每日快报资讯
  • 提示词工程进阶——让大模型输出你想要的JSON格式
  • 成都榻榻米定制新选择,舒适实用打造理想家居空间 - 官方资讯
  • 猫抓浏览器资源嗅探扩展完整攻略:三步装上,轻松搞定网页视频与M3U8下载
  • 2026 河北短视频培训教学服装店主短视频运营提升方法 - 中国华商产业观察网
  • 死档激活需要什么手续?实操流程直接抄 - 趣闻早乐评
  • Elicitation原语:Server向Client请求用户输入
  • Uniswap V3 AMM核心原理:集中流动性与Tick数学
  • 【Logisim 本地搭建】手动版无符号 8 位乘法器的详细教程
  • 2026智能称重传感器厂家哪家靠谱?优质厂家推荐与选型要点分享 - 商业新知
  • Nucleus Co-op 本地分屏联机完整指南:免费开源工具如何用一台电脑玩转 800+ 款游戏
  • OpenCore配置工具OCAT使用指南:免费跨平台搞定黑苹果EFI维护
  • 门店关停西安营业执照注销?提前备齐这几样,新手也能一次办成! - 实时传讯
  • 2026年韩国进口食品批发商前十,哪家更值得长期合作? - 官方资讯
  • 出海品牌如何借助拓氪科技搭建AI可收录的知识资产壁垒?
  • 程序员避坑,单干你要学的是做自媒体,不是啃技术
  • 删数问题(贪心)