随记
XML 配置文件:可验证、可扩展的标记格式
介绍 XML 元素、属性、转义、命名空间与 Schema,理解其强验证能力、适用生态和安全解析边界。
发布于 2026年7月24日
XML 配置文件:可验证、可扩展的标记格式
XML 使用元素、属性和文本组成树形文档。与 JSON 或 YAML 相比,它显得冗长,但拥有成熟的命名空间、Schema、查询和转换工具链,适合需要严格契约、长期兼容或与既有标准互通的配置。
XML 只规定文档结构和文本表示。8080、false 等内容是否属于整数或布尔值,通常由应用、DTD 或 XML Schema 决定。
一、完整示例
<?xml version="1.0" encoding="UTF-8"?>
<config>
<app name="config-demo" debug="false">
<features>
<feature>search</feature>
<feature>cache</feature>
</features>
</app>
<server host="127.0.0.1" port="8080" />
<database pool-size="10" />
</config>
文档只有一个根元素 <config>。app、server 和 database 表示配置分组;属性保存简短标量;重复的 <feature> 元素自然形成列表。
二、常用语法
元素与属性
普通元素由开始标签和结束标签包围:
<name>config-demo</name>
没有子内容时可使用空元素:
<server host="127.0.0.1" port="8080" />
元素和属性如何分工没有唯一答案。常见做法是把有层级、可重复或可能扩展的内容写成元素,把简短、稳定的元数据写成属性,并在同一项目中保持一致。
转义、注释与命名空间
文本中的 <、> 和 & 等特殊字符需要写成实体引用,例如 <、> 和 &。属性值必须加引号。
注释写作:
<!-- 监听地址仅用于本地开发 -->
命名空间用于区分来自不同词汇表的同名元素:
<app:config xmlns:app="https://example.com/app-config">
<app:name>config-demo</app:name>
</app:config>
XML 声明可以指定版本与编码。新配置通常使用 XML 1.0 和 UTF-8。
三、Schema 与验证
“格式良好”表示标签正确嵌套、只有一个根元素、属性已加引号等;“有效”则表示文档还满足 DTD 或 Schema 定义的业务结构。
XML Schema 可以声明元素顺序、是否必填、允许出现次数、数字范围和数据类型。对跨组织协议或长期保存的配置,这类机器可验证契约很有价值。简单的单应用配置则不一定值得引入完整 Schema,应按失败风险决定。
四、适用场景
XML 适合:
- 行业标准、企业集成或现有平台已经规定 XML。
- 需要命名空间组合多个词汇表。
- 需要 XSD、XPath、XSLT 或成熟编辑器支持。
- 配置必须做严格结构验证并长期保持向后兼容。
- 文档包含混合文本与标记,而不只是普通键值数据。
简单应用设置、频繁手改的短文件或纯对象数据,通常使用 JSON、YAML 或 TOML 更紧凑。
五、与其他格式对比
| 对比格式 | XML 的优势 | XML 的不足 |
|---|---|---|
| JSON | 命名空间、属性、Schema 和文档工具链更成熟 | 映射到普通对象时标记冗长 |
| YAML | 结构契约和标准化工具更强 | 手工编辑成本更高,列表写法更繁琐 |
| TOML | 能表达文档型结构、重复元素和扩展词汇 | 小型应用配置不如 TOML 清晰 |
| Properties | 能表达真正的树与重复节点 | Java 简单键值配置无需承担 XML 复杂度 |
XML 的元素顺序、空白和命名空间可能具有语义;不要未经约定就把它简单转换为 JSON 对象,否则可能丢失信息。
六、常见错误与安全提醒
- 所有标签必须正确嵌套且大小写匹配,并且文档只能有一个根元素。
- 声明与实际编码保持一致。文件保存为 UTF-8 时,不要留下错误的编码声明。
- 转义特殊字符。不要用字符串拼接生成 XML,应使用安全的 XML 库。
- 默认禁用外部实体和不必要的 DTD。解析不受信任 XML 时,要防范外部实体读取本地文件、发起网络请求或造成资源耗尽。
- 限制文档大小与嵌套深度,并避免无限制实体展开。
- 验证 Schema 版本。命名空间 URI、XSD 版本和应用版本应有明确兼容策略。
- 不要在属性中堆积复杂数据。列表或未来可能扩展的结构更适合子元素。
七、选型建议
如果上下游已经围绕 XML、XSD 或行业标准构建工具链,应继续使用 XML,而不是为了减少几行文本而转换格式。新建的普通应用配置若不需要命名空间和强 Schema,TOML、YAML 或 JSON 通常更轻量。
决定使用 XML 后,应同时定义命名空间、Schema、编码、外部实体策略和版本演进规则,才能真正发挥它的可靠性优势。