如何在XML中定义ID和IDREF实现关联

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

在XML中,IDIDREF是用于建立元素间引用关系的内置类型,它们依赖DTD(文档类型定义)或XML Schema声明才能生效,不是单纯靠命名约定就能起作用的。

必须通过DTD或Schema声明类型

XML解析器只在有明确类型声明的前提下,才将ID属性识别为唯一标识符,把IDREF识别为对ID的引用。没有声明时,即使属性名叫idref,也仅是普通字符串。

  • 在DTD中用ATTLIST指定:

  • 在XSD中用xsd:IDxsd:IDREF类型:

ID值必须全局唯一且符合命名规则

ID属性的值不能以数字开头,不能含空格、冒号、句点等特殊字符,只能是合法的XML名称(类似元素名规则)。

  • ✅ 合法:id="user123"id="order_A"
  • ❌ 非法:id="123user"id="my order"id="user@2025"
  • ⚠️ 注意:同一文档中所有ID值必须互不相同,否则验证会失败

IDREF必须指向已声明且存在的ID值

IDREF本身不定义标识,只是“指针”。它必须严格匹配某个ID属性的值(大小写敏感),且该ID需出现在当前XML文档内(不支持跨文件引用)。

  • 示例片段(配合DTD):
    张三

    此时customerID成功引用了personid
  • 如果customerID="p999"但文档中无id="p999",验证时会报错

实际使用中的常见限制

ID/IDREF机制简单,但功能有限,不支持多值引用、反向查询或复杂路径。

  • 一个IDREF只能引用一个ID;如需多个引用,要用IDREFS(注意末尾S)
  • 无法表达“属于某类”的语义,比如“所有订单中customerID指向person”,需靠应用逻辑或XPath/XQuery补充
  • 现代开发中,更多采用自定义属性(如data-id)配合程序解析,而非强依赖ID/IDREF验证
不复杂但容易忽略类型声明这一步,没DTD或XSD,ID和IDREF就只是普通属性名。