XML

Extensible Markup Language 的缩写,一种使用标签描述数据结构的标记语言。

XML (Extensible Markup Language) 是一种用标签描述数据结构的通用标记语言。1998 年由 W3C 制定为推荐标准,与 HTML 一样源自 SGML,但最大特点是可以自由定义自己的标签。由于能够明确表达数据的含义和结构,被广泛用作不同系统之间的数据交换格式。

XML 拥有丰富的相关技术生态系统。XSD (XML Schema Definition) 用于模式验证,XSLT (XSL Transformations) 用于转换,XPath 用于元素定位,命名空间用于避免词汇冲突,为处理大规模复杂数据结构提供了完善的机制。在实际应用中,XML 用于 sitemap.xml (搜索引擎站点地图)、RSS/Atom 订阅 (新闻分发)、SOAP (Web 服务协议)、SVG (矢量图形)、Office 文档 (OOXML) 等众多领域。

XML 的语法规则比 HTML 更严格。所有标签必须关闭 (<br />),属性值必须用引号括起来,区分大小写,且只能有一个根元素。必须转义的字符只有 & 与 < 两个,分别写成 &amp; 与 &lt; 这样的实体引用。> 只有在成为 ]]> 这一序列的一部分时才是必须转义的,而引号 (" 与 ') 是在与括住属性值的符号相冲突时使用的便宜性转义 (W3C 的 XML 1.0 规范的规定)。实务上把 5 个字符一并转义更为安全;但只要知道必须的只有 2 个字符这一区别,即使其他系统输出的 XML 在转义粒度上有所不同,也不会误判为非法。这种严格性简化了解析器的实现,提高了数据的可靠性。

近年来 JSON 正在取代 XML 作为 REST API 的响应格式,但仍有一些场景会选择 XML:需要丰富的文档结构表达能力 (混合内容、属性与文本共存)、需要严格的模式验证、需要基于命名空间的词汇管理、或需要与现有系统兼容。以 XML 作为行业标准而扎根的领域也很多,但规范名称与数据格式并非一对一。金融行业的 FIX 本来是把标签与值排列起来的文本格式,XML 版作为 FIXML 另行定义,主要用于清算和后台业务。医疗领域的 HL7 也是如此,广泛普及的版本 2 系是用竖线符号分隔的文本,使用 XML 的是版本 3 系和诊疗文档规范 CDA。在调查对接规范时,请不要仅凭规范名称判断格式,还要确认到版本。

XML 与 JSON 的比较中,XML 由于标签和属性等语法元素较多容易冗长,但支持模式验证和注释。JSON 更简洁轻量,但不能写注释,模式验证需要 JSON Schema 这一独立机制。

从字符计数角度来看,XML 由于标签和属性等语法元素较多,表示相同数据时字符数比 JSON 或 YAML 更多。例如 <name>太郎</name> 是 15 个字符,而 JSON 的 "name": "太郎" 是 12 个字符。元素越多差距越大,<person><name>太郎</name><age>30</age></person> 是 45 个字符,内容相同的 {"name":"太郎","age":30} 是 22 个字符 (以 Python 3 实测)。由于要把结束标签的名称再写一遍,字数随元素个数成比例增加,这是 XML 结构上的性质。不过在作为传输量考察时,请连 gzip 或 Brotli 的压缩一起比较。反复出现的标签名容易被压缩,压缩后的差异不会像字符数的差异那样大幅留存。如果要考虑 API 响应大小的优化,先确认是否启用压缩再作判断才更符合实际。

分享这篇文章