XML Schema(简称xsd)用于定义XML文档的元素、属性、数据类型等结构规则,其中全局元素和局部元素是两种最基础的元素定义形式,二者的作用域和使用方式存在明显差异,掌握它们的定义方法是编写xsd文件的基础。

全局元素的定义方法
全局元素是指在<xs:schema>根元素下直接定义的元素,它的作用域是整个xsd文档,可以被其他元素引用,也可以作为XML文档的根元素使用。
定义全局元素的基本语法如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 定义全局元素user -->
<xs:element name="user" type="xs:string"/>
<!-- 定义全局元素age,指定数据类型为整型 -->
<xs:element name="age" type="xs:integer"/>
</xs:schema>
上述代码中,user和age都是全局元素,它们可以直接作为XML文档的根元素,比如下面的XML文档是合法的:
<?xml version="1.0" encoding="UTF-8"?> <user>张三</user>
局部元素的定义方法
局部元素是定义在某个父元素内部、或者定义在<xs:sequence>、<xs:choice>等组合器内部的元素,它的作用域仅限于所在的父元素,不能被其他元素直接引用,也不能作为XML文档的根元素。
定义局部元素的常见方式有两种,一种是在父元素的<xs:complexType>内部直接定义,另一种是先定义复杂类型再引用。
方式一:直接在父元素内定义局部元素
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 定义全局元素person,内部包含局部元素name和age -->
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<!-- 局部元素name,仅能在person元素内部使用 -->
<xs:element name="name" type="xs:string"/>
<!-- 局部元素age,仅能在person元素内部使用 -->
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
方式二:先定义复杂类型再引用
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 定义复杂类型PersonType,包含局部元素name和age -->
<xs:complexType name="PersonType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<!-- 全局元素person引用PersonType类型 -->
<xs:element name="person" type="PersonType"/>
</xs:schema>
上述两种方式中,name和age都是局部元素,只能在person元素内部出现,下面的XML文档符合定义规则:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>李四</name>
<age>25</age>
</person>
全局元素和局部元素的核心差异
二者的核心区别主要体现在作用域、可引用性、根元素资格三个方面,具体对比如下:
| 对比维度 | 全局元素 | 局部元素 |
|---|---|---|
| 定义位置 | <xs:schema>根元素下直接定义 | 父元素的complexType或组合器内部定义 |
| 作用域 | 整个xsd文档 | 仅所在的父元素内部 |
| 可引用性 | 可以被其他元素通过ref属性引用 | 不能被其他元素直接引用 |
| 根元素资格 | 可以作为XML文档的根元素 | 不能作为XML文档的根元素 |
实际使用示例
下面是一个完整的xsd示例,同时包含全局元素和局部元素的定义,满足用户信息的结构约束:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- 全局元素userInfo,作为XML文档的根元素 -->
<xs:element name="userInfo">
<xs:complexType>
<xs:sequence>
<!-- 局部元素id -->
<xs:element name="id" type="xs:integer"/>
<!-- 局部元素username -->
<xs:element name="username" type="xs:string"/>
<!-- 局部元素contact,内部包含嵌套的局部元素 -->
<xs:element name="contact">
<xs:complexType>
<xs:sequence>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
对应的合法XML文档如下:
<?xml version="1.0" encoding="UTF-8"?>
<userInfo>
<id>1001</id>
<username>王五</username>
<contact>
<phone>13800138000</phone>
<email>test@ipipp.com</email>
</contact>
</userInfo>
在实际开发中,如果需要某个元素在多个地方复用,或者需要作为根元素,就选择定义全局元素;如果元素只在某个父元素内部使用,不需要被其他元素引用,就选择定义局部元素,这样能让xsd文档的结构更清晰,约束更精准。
XML_Schema全局元素局部元素xsd元素定义修改时间:2026-07-09 20:57:39