在XML Schema(XSD)里,list类型用来描述“由空白字符分隔的多个值” such 的数据结构。它属于简单类型的一种派生方式,能够把一个原子类型(atomic type)变成可接受多个该类型实例的集合。最常见的用途是让某个属性或元素内容写成“10 20 30”这样的形式,校验器会自动按空白拆开,并逐个用原子类型检查合法性。

一、list类型的基本定义方式
要定义一个空白分隔的列表,核心是使用 xs:list 元素,并通过 itemType 属性指定列表中每个条目的数据类型。通常我们会先定义一个原子简单类型,再基于它声明list类型,这样结构更清晰,也方便复用。
例如,我们希望一组颜色编号用空格分开,且每个编号都是正整数,可以先定义正整数类型,再包装成list。下面这段代码展示了完整的schema片段:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="PositiveNum">
<xs:restriction base="xs:integer">
<xs:minInclusive value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="NumList">
<xs:list itemType="PositiveNum"/>
</xs:simpleType>
<xs:element name="codes" type="NumList"/>
</xs:schema>
上述定义中,NumList 就是list类型。当XML实例写成 <codes>3 5 8</codes> 时,校验器会将其识别为三个 PositiveNum 值,且都大于等于1,因而合法。如果写成 3 -2 8,则因 -2 不满足最小 inclusive 限制而被判定无效。
除了自定义原子类型,也可以直接引用XSD内建类型。比如 <xs:list itemType="xs:string"/> 能接受任意用空白分开的字符串序列。这种方式快捷,但缺少业务约束,适合通用工具场景。
二、空白分隔的具体规则
很多初学者误以为list只能用空格分开,其实按照XML Schema规范,凡是XML定义的空白字符都可以作为分隔符,包括普通空格、制表符(tab)、换行符和回车符。这意味着下面的写法全部等价且合法:
<codes>1 2 3</codes> <codes>1 2 3</codes> <codes> 1 2 3 </codes>
校验器在解析list时,首先按空白字符做标准化(white-space collapse),把连续空白当成一个分隔符,然后切分条目。因此用户换行书写也不会导致错误,这对人工编辑的配置文件非常友好。
不过要注意,list类型本身不支持嵌套。也就是说,不能在一个list里再放一个list。如果业务需要“列表的列表”,通常要改用复杂类型或者把外层用某种明确分隔符(如逗号)的字符串处理,再结合 xs:pattern 限制格式。
三、结合union增强灵活性
如果希望列表既能填数字也能填特定关键字,可以先用 xs:union 把原子类型组合起来,再作为list的itemType。这样每个列表项可以是联合类型中的任意一种。
<xs:simpleType name="TokenOrNum">
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="auto"/>
<xs:enumeration value="none"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:union>
</xs:simpleType>
<xs:simpleType name="MixedList">
<xs:list itemType="TokenOrNum"/>
</xs:simpleType>
此时实例 <vals>auto 12 none 5</vals> 能够通过校验,因为每一项都匹配联合类型。这种设计在配置项中很实用,既保留人工可读关键字,也支持数值批量设置。
从工程角度看,list类型降低了XML冗余标签的数量。相比把每个值包成子元素,空白分隔列表更紧凑,解析后程序也能直接拿到数组。但代价是可读性在值很多时会下降,所以一般建议单列表项不超过十个,超出的场景仍用子元素结构更稳妥。
四、在元素与属性上的应用差异
list类型既能用于元素内容,也能用于属性值。属性本身默认就会对空白做折叠,因此用list定义属性时,写法与元素基本一致,只是声明位置不同。
<xs:attribute name="ids" type="NumList"/>
实例中可写 <user ids="4 8 15"/>,解析后 ids 得到三个整数。由于属性无法换行书写(虽可换行但不符合习惯),list在属性上更适合短小集合;元素内容则可以利用换行提升长列表的可维护性。
最后提醒,若使用 xs:list 时未指定 itemType,旧版规范允许通过子元素 xs:simpleType 内联定义,但显式写 itemType 可读性更好,也避免工具链兼容问题。掌握这些要点后,便能用XSD轻松约束空白分隔的数据列表。
XSDlist类型XML_Schema修改时间:2026-08-09 19:15:30