XML Schema里的xs:simpleContent用于定义不包含子元素、只包含文本内容和属性的复杂类型,而extension则是该元素下的核心子元素,用来在基础简单类型的基础上扩展新的属性,实现简单内容的扩展定义。

xs:simpleContent extension的基本语法
使用xs:simpleContent的extension扩展简单内容时,需要先定义一个基础简单类型,再通过extension添加属性,基础语法结构如下:
<xs:complexType name="扩展类型名称">
<xs:simpleContent>
<xs:extension base="基础简单类型">
<xs:attribute name="属性名" type="属性类型" use="可选/必填"/>
<!-- 可以添加多个属性 -->
</xs:extension>
</xs:simpleContent>
</xs:complexType>
其中base属性指定要扩展的基础简单类型,可以是内置简单类型比如xs:string、xs:integer,也可以是自定义的其他简单类型。
具体使用示例
假设我们需要定义一个表示用户年龄的类型,基础值是整数,同时需要添加是否为成年人的属性,就可以用extension扩展实现:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/user"
xmlns="http://www.example.org/user"
elementFormDefault="qualified">
<!-- 定义扩展后的年龄类型 -->
<xs:complexType name="ageType">
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="isAdult" type="xs:boolean" use="required"/>
<xs:attribute name="unit" type="xs:string" default="岁"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- 定义用户元素使用该类型 -->
<xs:element name="userAge" type="ageType"/>
</xs:schema>
对应的合法XML实例可以写成:
<?xml version="1.0" encoding="UTF-8"?> <userAge xmlns="http://www.example.org/user" isAdult="true" unit="岁">18</userAge>
extension和restriction的差异
很多开发者会混淆xs:simpleContent下的extension和restriction,两者的核心差异如下:
| 对比项 | extension | restriction |
|---|---|---|
| 作用 | 在基础类型上添加属性,不限制基础类型的取值范围 | 对基础类型的取值范围、长度等进行约束,不能添加属性 |
| 基础类型要求 | 可以是任意简单类型 | 必须是简单类型,且约束规则不能超出基础类型的范围 |
| 结果类型 | 仍然是包含文本内容和属性的复杂类型 | 可以是简单类型或者包含简单内容的复杂类型 |
使用注意事项
- extension扩展的基础类型必须是简单类型,不能是已经包含子元素的复杂类型,否则会导致XSD校验失败。
- 扩展后的类型在XML实例中,文本内容必须符合基础简单类型的校验规则,比如基础类型是xs:integer,文本内容就不能是字符串。
- 如果需要对基础类型同时做约束和添加属性,需要先通过restriction定义约束后的简单类型,再基于这个约束后的类型做extension扩展。
通过上述用法,开发者可以灵活通过xs:simpleContent的extension实现XSD简单内容的扩展,满足实际业务中需要给简单文本值附加属性的场景需求。
XML_Schemaxs:simpleContentextensionXSD扩展简单内容修改时间:2026-07-12 04:45:21