5月27日 10:49

XML 和 JSON 有什么区别?什么时候该用 XML?

XML 和 JSON 是两种最常用的数据交换格式,但它们的定位不同:XML 是标记语言,擅长表达文档结构;JSON 是数据格式,擅长表达结构化数据。现代 Web 开发 90% 的场景用 JSON,但 XML 在特定领域仍然不可替代。

核心区别

特性XMLJSON
定位标记语言,面向文档数据格式,面向数据
语法标签闭合 <name>值</name>键值对 "name": "值"
数据类型无内置类型,都是字符串string、number、boolean、null、array、object
注释支持 <!-- -->不支持
命名空间支持,避免标签冲突不支持
验证DTD / XSD 成熟方案JSON Schema(较新,工具链不完善)
冗余度高(开闭标签重复)
解析速度慢(DOM/SAX)快(原生支持)

一句话概括:XML 能做文档,JSON 只能做数据;JSON 传输快,XML 验证强。

什么时候必须用 XML

包含文档内容:XML 的标签能表达语义和层级(标题、段落、列表),JSON 的键值对做不到。Office 文档(docx、xlsx)底层是 XML,RSS/Atom feed 也是 XML——这些场景需要混合内容和结构。

需要严格验证:XSD 可以定义精确的类型约束(值范围、正则模式、枚举),JSON Schema 功能弱得多。金融、医疗、政府数据交换标准(如 HL7、FHIR 的 XML 格式)依赖 XSD 验证。

命名空间:多个词汇表组合时,命名空间避免标签冲突。SOAP、XHTML、SVG 都用命名空间。JSON 没有这个能力。

遗留系统集成:企业里大量旧系统只认 XML。SAP、Oracle、银行接口——你不想用也得用。

JSON 的优势场景

Web API:RESTful API 用 JSON 是事实标准。体积小、解析快、前端原生支持,没有理由用 XML。

配置文件:package.json、tsconfig.json、.eslintrc——开发工具链已经全面倒向 JSON(以及 JSON 超集如 JSON5、YAML)。

移动端和低带宽场景:JSON 比 XML 小 30-50%,解析快 2-3 倍。移动网络下这个差距很实际。

NoSQL 数据库:MongoDB、CouchDB 存储 JSON 文档,查询天然适配。

同一数据的格式对比

xml
<!-- XML --> <book id="1" category="web"> <title>XML Guide</title> <price>39.95</price> <tags> <tag>XML</tag> <tag>Programming</tag> </tags> </book>
json
{ "id": 1, "category": "web", "title": "XML Guide", "price": 39.95, "tags": ["XML", "Programming"] }

XML 版本 156 字节,JSON 版本 98 字节。数据量大的时候,这个差距更明显。

格式互转

XML 和 JSON 互转不是无损的——XML 的属性、命名空间、混合内容在 JSON 里没有对应概念:

  • XML 属性(<book id="1">)转 JSON 时变成普通字段,丢失"这是属性"的语义
  • XML 混合内容(<p>文字<b>加粗</b>继续</p>)转 JSON 需要特殊处理
  • JSON 的数组类型转 XML 时只能用重复标签模拟

所以别指望"先写 XML 再转 JSON"或反过来——两种格式的数据模型不同,互转会丢信息。

选型决策

简单判断:如果数据是给人读的文档,用 XML;如果是给程序消费的结构化数据,用 JSON。如果两者都涉及(比如带格式的富文本数据),考虑用 JSON 做传输、XML 做存储,或者直接用 Markdown + JSON 元数据的组合方案。

标签:XML