加载失败
Relax NG 是为 XML 提供 schema 描述的一种方案,旨在比 W3C XML Schema(XSD)或 DTD 更简单灵活,并且有一种非 XML 的 Compact 语法以提高可读性。讨论发生在对 XML 在 1990s/2000s 的广泛采用及其后续衰减的回顾背景下,涉及文档标记(如 DocBook、MathML、SVG)、服务接口(如 SOAP/WSDL)和构建/配置系统的历史教训。评论假定读者了解 XML 与 schema 的基本用途,并围绕工具化(从 schema 生成代码与校验器)、滥用情形(构建系统、前端、复杂的 Web 服务)以及调试可用性问题展开。现代替代品如 JSON(及其超集 JSON5)和 Protobuf 在序列化/轻量通信上的优势,也是本讨论用来对比 XML 适用场景的重要上下文。
评论普遍赞扬 Relax NG 的模型和其“Compact”非 XML 语法,认为语法更简洁、更可读,写起来像 TypeScript 风格且比 XSD 更容易掌握。Relax NG 在设计上去掉了 XSD 的某些约束(如 Unique Particle Attribution),因此能表达更宽泛的内容模型。实践中存在显著痛点:用 libxml2 做 RNG 校验时错误信息被指出“几乎无用”,定位 schema 错误困难;把外来或不需校验的片段嵌入文档但仍验证本地内容也比较麻烦。总体态度是既欣赏语法和模型,也对调试、错误信息和集成细节持保留。
评论回忆 XML 在早期比此前为每个端点自定义格式的混乱好很多,配合 XSD 或 Relax NG 能支持工具链自动化,像是从 schema 生成强类型模型类和校验器,从而提高互操作性并减少首次调用失败的概率。命名空间机制允许在同一文档中混合 MathML、SVG 等不同标记集,DocBook 等基于 XML 的文档系统在出版和归档场景表现良好。有评论指出这些工具化与稳定性能力是金融和银行等传统行业至今仍大量使用 XML 的主要原因,而不是 Web 前端领域的可见度。
不少评论认为 XML 的问题多来自滥用:把 XSLT 用来把 XML 当函数式转换语言做前端、把配置或构建系统写成 XML(如 Ant/Maven)等都是不当使用,导致体验糟糕。SOAP+WSDL 被多次当作反面教材:协议复杂、实现互操作性差、调试困难,有案例指出某些实现把 SOAP 请求当作字符串数组处理,使协议的结构化优势形同虚设。对比之下,基于 REST 的 JSON 接口更容易用 curl 诊断问题,说明生态实现和可调试性比语言本身更能决定实际可用性。
评论普遍把 XML 视为面向文档的标记语言,而并非最理想的对象序列化格式:序列化通常需要基本类型、简洁结构和易于映射到语言对象的行为,XML 的属性、命名空间和冗长标签在序列化场景常被视为累赘。JSON 因简洁和直观成为序列化与 REST 的主流,但也被滥用为配置而缺少注释支持,有人希望 JSON5(支持注释和更宽松语法的 JSON 超集)能得到更好支持来缓解这类问题。同时评论也提到 Protobuf 等二进制 schema 格式在强类型机对机通信场景下更合适。
Relax NG: 一种用于 XML 的 schema 语言,语义比 W3C XML Schema(XSD)更简单灵活,便于描述 XML 文档结构并支持更宽泛的内容模型。
Relax NG Compact Syntax: Relax NG 的紧凑非 XML 表示法,语法更简洁可读,常被开发者称为比 XSD 更易写读的格式。
XSD (W3C XML Schema): W3C 制定的 XML Schema 语言,用于定义 XML 文档的结构和类型,功能强大但语法复杂并包含向后兼容的约束(例如 Unique Particle Attribution)。
SOAP: 一种基于 XML 的消息与远程过程调用协议,历史上常与 WSDL 配合用于 Web 服务,但常被批评实现繁复且互操作性差。
WSDL: WSDL(Web Services Description Language),用于描述基于 SOAP 的服务接口和消息格式,常与 SOAP 一起出现并引发版本与实现兼容问题。
XSLT: XSLT(XSL transformations),一种用 XML 表示的声明式转换语言,用于将一种 XML 转换为另一种格式,合理使用时适合文档转换但被滥用会造成架构复杂。
namespaces(XML 命名空间): XML 的命名空间机制,允许在同一文档中混合来自不同标准(如 MathML、SVG)的标记集,但在很多客户端场景中并未被充分利用。