XML 用元素、属性和文本表示树形文档。它比 JSON 冗长,但具有命名空间、混合文本内容和成熟的 Schema 工具,仍广泛用于文档格式、工程配置和既有协议。
良构文档
跳转到“良构文档”<?xml version="1.0" encoding="UTF-8"?><devices> <device id="sensor-a"> <enabled>true</enabled> <port>8000</port> </device></devices>一个良构 XML 文档必须满足:
- 只有一个根元素。
- 开始和结束标签正确嵌套,元素名区分大小写。
- 属性值使用引号。
- 文本中的
<和&分别写为<和&。 - 声明的字符编码与实际字节编码一致。
“良构”只表示语法合法。要约束元素顺序、数量和数据类型,还需要 XSD、RELAX NG 等 Schema,或应用层验证。
元素还是属性
跳转到“元素还是属性”优先用元素表达主要数据和可扩展内容,用属性表达简短、不可重复的元数据。不要把大型文本或需要层级结构的数据塞进属性。
<device id="sensor-a" status="active"> <description>生产线入口传感器</description></device>命名空间
跳转到“命名空间”命名空间 URI 用于区分不同词汇表中的同名元素;它是标识符,不要求能够在浏览器中打开。
<cfg:device xmlns:cfg="urn:example:device-config"> <cfg:name>sensor-a</cfg:name></cfg:device>解析时应按“命名空间 URI + 本地名”匹配,不要依赖前缀 cfg,因为前缀可以改变。
解析策略
跳转到“解析策略”| 场景 | 策略 |
|---|---|
| 小型文档、需要随机访问 | DOM 或等价树模型 |
| 大文件、只需顺序处理 | 流式解析器,例如 SAX 或 pull parser |
| 必须符合固定结构 | 解析后执行 Schema 或应用层验证 |
| 不受信任输入 | 禁用外部实体、外部 DTD 和不必要的网络访问 |
在 Qt 中,QXmlStreamReader 和 QXmlStreamWriter 适合流式读写。无论使用哪种库,都要检查解析器错误,并对缺失、重复和未知字段制定明确策略。
XML 的能力较多,也意味着默认行为更多。处理外部输入时先收紧解析器功能,再考虑便利性。
来源:CSDN 原文,首次发布于 2025-03-26。