ID和IDREF是XML中依赖DTD或XML Schema声明才能生效的内置类型,用于建立元素间唯一引用关系;未声明时仅是普通字符串,ID值须全局唯一且符合XML名称规则,IDREF必须严格匹配文档内已声明的ID值。

在XML中,ID和IDREF是用于建立元素间引用关系的内置类型,它们依赖DTD(文档类型定义)或XML Schema声明才能生效,不是单纯靠命名约定就能起作用的。
必须通过DTD或Schema声明类型
XML解析器只在有明确类型声明的前提下,才将ID属性识别为唯一标识符,把IDREF识别为对ID的引用。没有声明时,即使属性名叫id或ref,也仅是普通字符串。
- 在DTD中用
ATTLIST指定: - 在XSD中用
xsd:ID和xsd:IDREF类型:
ID值必须全局唯一且符合命名规则
ID属性的值不能以数字开头,不能含空格、冒号、句点等特殊字符,只能是合法的XML名称(类似元素名规则)。
- ✅ 合法:
id="user123"、id="order_A" - ❌ 非法:
id="123user"、id="my order"、id="user@2024" - ⚠️ 注意:同一文档中所有
ID值必须互不相同,否则验证会失败
IDREF必须指向已声明且存在的ID值
IDREF本身不定义标识,只是“指针”。它必须严格匹配某个ID属性的值(大小写敏感),且该ID需出现在当前XML文档内(不支持跨文件引用)。
- 示例片段(配合DTD):
张三
此时customerID成功引用了person的id - 如果
customerID="p999"但文档中无id="p999",验证时会报错
实际使用中的常见限制
ID/IDREF机制简单,但功能有限,不支持多值引用、反向查询或复杂路径。
- 一个
IDREF只能引用一个ID;如需多个引用,要用IDREFS(注意末尾S) - 无法表达“属于某类”的语义,比如“所有订单中customerID指向person”,需靠应用逻辑或XPath/XQuery补充
- 现代开发中,更多采用自定义属性(如
data-id)配合程序解析,而非强依赖ID/IDREF验证










