JSON 出现后,XML 的新项目份额大幅缩减——但 XML 从未消亡。SOAP/WSDL、SVG、XHTML、Android 布局文件、Maven POM、Office Open XML(.docx/.xlsx)全都是 XML。遇到 XML 时,会读 namespace、会用 XPath,能省掉大量循环代码。
XML vs JSON:各自的地盘
| 维度 | XML | JSON |
|---|---|---|
| 语法 | 标签 + 属性 + 文本,层次明确 | 键值对 + 数组,简洁 |
| 类型系统 | 一切字符串,靠 XSD 约束 | 原生 number/bool/null |
| 命名空间 | 有(xmlns),可混合多来源 | 无标准机制 |
| 注释 | <!-- --> | 不支持(JSON5 支持) |
| 混合内容 | 支持(文本+子元素并列) | 不支持 |
| Schema 成熟度 | XSD 极强 | JSON Schema 较弱 |
| 主要场景 | 企业集成/文档/配置/Web标准 | Web API / 配置文件 |
XML 没被取代的核心原因:namespace 和混合内容(mixed content)是 JSON 没有的能力,复合文档场景无可替代。
命名空间(Namespace)实战
读 SOAP 消息
<soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:biz="http://example.com/bizservice">
<soap:Header/>
<soap:Body>
<biz:GetOrder>
<biz:orderId>12345</biz:orderId>
</biz:GetOrder>
</soap:Body>
</soap:Envelope>
解读:
xmlns:soap="..."→ 前缀soap:绑定到 SOAP 规范的 URIxmlns:biz="..."→ 前缀biz:绑定到业务服务的 URI<soap:Body>是 SOAP 协议的 Body,<biz:GetOrder>是业务方法- URI 只是标识符,不能访问(不是 REST endpoint)
默认命名空间
<project xmlns="http://maven.apache.org/POM/4.0.0">
<groupId>com.example</groupId> <!-- 无前缀,属于默认 namespace -->
<artifactId>myapp</artifactId>
</project>
xmlns="..." 不带前缀 → 该元素及所有无前缀子元素都属于这个 namespace。Maven POM 就是这样——所有元素无前缀,但都在 Maven 的 namespace 下。
XPath 10 条常用表达式
以这个 XML 为例:
<catalog>
<book id="1" lang="zh">
<title>深入理解计算机系统</title>
<price currency="CNY">99.9</price>
<tags><tag>计算机</tag><tag>经典</tag></tags>
</book>
<book id="2" lang="en">
<title>Clean Code</title>
<price currency="USD">45.0</price>
<tags><tag>编程</tag></tags>
</book>
</catalog>
| # | 表达式 | 结果 |
|---|---|---|
| 1 | /catalog/book | 所有 book 元素 |
| 2 | //book | 任意位置的 book 元素(同上,因为只有一层) |
| 3 | //book[1] | 第一个 book(id=1) |
| 4 | //book[@lang="zh"] | lang 属性为 zh 的 book |
| 5 | //book/@id | 所有 book 的 id 属性值 |
| 6 | //title/text() | 所有 title 的文本:深入理解…、Clean Code |
| 7 | //price[@currency="CNY"]/text() | 人民币价格文本:99.9 |
| 8 | //book[price > 50] | price 大于 50 的 book |
| 9 | //tag[text()="计算机"]/../../title/text() | 含”计算机”标签的书名 |
| 10 | count(//book) | book 总数:2 |
// vs / 的区别:/ 是绝对/相对路径中的层级分隔,// 表示”跳过任意层级”。/catalog/book 要求 book 直接在 catalog 下;//book 在任意深度都能找到。
常见 XML 格式速查
SVG(可缩放矢量图形)
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M12 2L2 7v10l10 5 10-5V7z" fill="currentColor"/>
</svg>
SVG 是 XML,可以用 XPath 分析图层结构,用 XML 工具格式化查看节点。
Maven POM
<project xmlns="http://maven.apache.org/POM/4.0.0">
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>6.1.0</version>
</dependency>
</dependencies>
</project>
Android 布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView android:text="Hello" android:textSize="16sp"/>
</LinearLayout>
android: 前缀绑定到 Android 命名空间,属性名才不和自定义属性冲突。
工具使用技巧
- 格式化:粘入压缩的单行 XML(SOAP 响应、日志里的 XML),点格式化变成可读的缩进树
- 验证:上传 XSD 文件校验 XML 是否符合 Schema 约束
- XPath 查询:在工具里直接输入 XPath 表达式,高亮匹配节点——比肉眼找节省 90% 时间
- 压缩:多行格式化 XML 压缩成单行,用于 HTTP 请求体
配套工具
- JSON 工具 — XML 之外的另一种结构化数据格式
- JSON 对比 — 对比两个 XML 转换后的 JSON 差异
- SVG 编辑预览 — SVG 是 XML,专项编辑工具
- YAML/CSV/XML 互转 — XML 和其他格式互相转换