XML Schema(简称XSD)是W3C推出的用于定义XML文档结构、内容和数据类型的标准规范,相比早期的DTD约束,它支持更丰富的数据类型,并且完全基于XML语法编写,可扩展性更强。通过编写XSD文件,可以明确XML中允许出现的元素、元素的嵌套关系、元素的属性、元素的出现次数以及数据类型等规则,从而确保XML文件符合预期的结构要求。

XSD文件的基础结构
一个标准的XSD文件本身也是XML格式,根元素为schema,需要声明对应的命名空间和XML Schema的命名空间。基础结构如下:
<?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:schema>
其中xmlns:xs是XML Schema标准命名空间的前缀声明,targetNamespace定义当前XSD的目标命名空间,elementFormDefault设置为qualified表示XML中的元素需要带命名空间前缀。
定义简单元素与数据类型
简单元素是指不包含子元素和属性的元素,只能包含文本内容。XSD内置了大量数据类型,比如xs:string、xs:integer、xs:date、xs:boolean等,可以直接使用。
定义简单元素的语法为:
<xs:element name="元素名称" type="数据类型" />
示例:定义一个用户年龄元素,要求为整数类型:
<xs:element name="age" type="xs:integer" />
如果需要限制简单元素的取值范围,可以使用xs:restriction自定义数据类型:
<xs:simpleType name="ageType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="120" />
</xs:restriction>
</xs:simpleType>
<xs:element name="age" type="ageType" />
定义属性
属性是附属于元素的额外信息,所有属性都是简单类型,不能包含子元素或复杂结构。定义属性的语法为:
<xs:attribute name="属性名称" type="数据类型" use="可选/必填" />
use的取值为optional(可选)或required(必填),默认是可选。示例:给用户元素添加id属性,必填且为整数类型:
<xs:attribute name="id" type="xs:integer" use="required" />
定义复杂元素
复杂元素是指包含子元素或者属性的元素,需要使用xs:complexType来定义。常见的复杂元素结构有三种:只包含子元素、只包含属性、同时包含子元素和属性。
只包含子元素的复杂元素
使用xs:sequence定义子元素的出现顺序,maxOccurs和minOccurs可以限制元素的出现次数,默认都是1次,maxOccurs="unbounded"表示不限制次数。
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:integer" minOccurs="0" />
<xs:element name="hobby" type="xs:string" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
同时包含子元素和属性的复杂元素
在xs:complexType中同时定义子元素和属性即可:
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="xs:integer" />
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required" />
<xs:attribute name="gender" type="xs:string" use="optional" />
</xs:complexType>
</xs:element>
完整的XSD示例与XML校验
以下是一个完整的用户列表XSD文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.ipipp.com/user"
xmlns="http://www.ipipp.com/user"
elementFormDefault="qualified">
<!-- 自定义年龄数据类型 -->
<xs:simpleType name="ageType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0" />
<xs:maxInclusive value="120" />
</xs:restriction>
</xs:simpleType>
<!-- 定义用户元素 -->
<xs:element name="user">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="age" type="ageType" minOccurs="0" />
</xs:sequence>
<xs:attribute name="id" type="xs:integer" use="required" />
</xs:complexType>
</xs:element>
<!-- 定义用户列表根元素 -->
<xs:element name="userList">
<xs:complexType>
<xs:sequence>
<xs:element ref="user" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
符合该XSD约束的XML文件示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<userList xmlns="http://www.ipipp.com/user"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.ipipp.com/user user.xsd">
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
</user>
</userList>
在Java中可以使用自带的XML校验API来校验XML是否符合XSD约束,示例代码如下:
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import java.io.File;
public class XsdValidateDemo {
public static void main(String[] args) {
try {
// 创建Schema工厂
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// 加载XSD文件
Schema schema = factory.newSchema(new File("user.xsd"));
// 创建校验器
Validator validator = schema.newValidator();
// 校验XML文件
validator.validate(new StreamSource(new File("user.xml")));
System.out.println("XML文件符合XSD约束");
} catch (Exception e) {
System.out.println("XML文件不符合XSD约束,错误信息:" + e.getMessage());
}
}
}
如果XML文件不符合XSD定义的规则,校验时会抛出异常,提示具体的错误位置和不合法的原因,方便开发者快速定位问题。
XSDXML_SchemaXMLXML约束修改时间:2026-07-06 11:39:16