relax ng 是一种比 dtd 更强大、比 xsd 更简洁的 xml 模式语言,支持 xml(.rng)和紧凑文本(.rnc)两种语法,天然支持混合内容、无序元素及灵活命名空间,适合文档类 xml 场景。

Relax NG 是一种用于定义和验证 XML 文档结构的模式语言,目标是比 DTD 更强大、比 XSD 更简洁。它由 OASIS 标准化,也是 ISO/IEC 19757-2 国际标准,支持两种语法形式:XML 格式(.rng)和紧凑文本格式(.rnc),后者更易读、更适合手写。
Relax NG 的核心特点
它不强制绑定命名空间,对混合内容(如文本与元素交错)和无序内容建模天然友好;允许用 <interleave></interleave> 表达子元素顺序无关,用 <mixed></mixed> 直接支持文本与子元素共存;数据类型可外挂(比如复用 W3C XML Schema 的 type 定义),但自身不内置复杂类型系统;所有语法都基于 XML,没有特殊字符或非 XML 规则。
Relax NG 和 XSD 的主要区别
-
语法复杂度:XSD 使用大量嵌套元素(
<sequence></sequence>、<choice></choice>、<complextype></complextype>等)和冗长前缀,而 Relax NG 用更少的构造(如<element></element>、<interleave></interleave>、<optional></optional>)表达相同逻辑 -
内容模型灵活性:XSD 要求明确指定顺序(
sequence)、选择(choice)或全部(all),且all有严格限制;Relax NG 的<interleave></interleave>可自然描述任意顺序的多个必需子元素 -
混合内容支持:XSD 对“段落中穿插
<em></em>或<link>”这类场景需绕弯(如用mixed="true"+xs:any),Relax NG 用<mixed></mixed>一层包裹即生效 -
命名空间处理:XSD 要求显式声明
targetNamespace并在每个元素上加前缀;Relax NG 默认按上下文解析命名空间,无需额外修饰即可复用带 ns 的文档结构 - 工具链与生态:XSD 被主流 IDE、Web 服务框架、SOAP 工具广泛内置;Relax NG 需借助 Jing、Trang 或 lxml 等第三方工具验证或转换,但 Trang 可双向转换 XSD ↔ RNG/RNC,便于过渡
什么时候更适合选 Relax NG
适合文档类 XML(如 DocBook、TEI、自定义配置文件),尤其是需要频繁编辑模式、强调可读性、内容结构松散或含大量文本混合的场景。如果你发现写一个 XSD 时总在堆砌 xs:annotation 加注释来让人看懂逻辑,那 Relax NG 的紧凑语法可能就是更直接的解法。
实际使用小提示
- 用
trang person.xsd person.rnc可快速把现有 XSD 转成易读的 .rnc 文件 - Jing 验证器命令行简单:
java -jar jing.jar schema.rng document.xml - 想保留 XSD 的数据类型校验?Relax NG 允许在
<data></data>中引用type="integer"或type="date",背后仍调用 W3C 类型库 - 多个模块组合?Relax NG 原生支持
<include></include>和<externalref></externalref>,拆分维护比 XSD 的xs:import/xs:include更轻量










