小数据选 DOM,因可随机访问和修改;大数据选 SAX,因流式解析内存占用低。

XML 解析选 DOM 还是 SAX?看数据规模和修改需求
小数据(DOM;大数据流式处理、只读遍历或内存受限时,SAX 或 StAX 更稳。Python 的 xml.etree.ElementTree 默认是轻量 DOM 模型,够用但不支持 DTD 验证;Java 里 javax.xml.parsers.DocumentBuilder 构建的 DOM 会全量加载,容易 OOM。
- DOM 修改后需显式调用
write()或序列化才能持久化,不是“自动保存” - SAX 没有树结构,无法回溯父节点,回调中必须自己维护上下文栈
- Go 的
encoding/xml是类 SAX 的 Unmarshal 流程,但底层按字段名匹配,大小写敏感且依赖 struct tag,比如xml:"user_name"才能映射
字段名不一致时,别硬改 XML,用映射配置或 tag 声明
XML 标签名常含下划线、驼峰混用或带命名空间前缀(如 ),直接映射到对象字段会失败。主流语言都支持声明式绑定:Python 的 dataclasses_xml 用 @attr 和 @element 注解;Java 的 JAXB 用 @XmlElement(name = "order_date");C# 的 XmlSerializer 支持 [XmlElement("order-date")]。
import dataclasses_xml as dx from dataclasses import dataclass@dataclass class Order: order_id: int = dx.field(xml="orderId") # 映射
created_at: str = dx.field(xml="created-at") # 映射
注意:不要在解析前用正则全局替换 XML 标签名——会破坏 CDATA、属性值、注释等合法内容。
空元素、缺失标签、文本混合子节点,这些才是真实 XML 的坑
规范 XML 可能写成 、 或干脆不出现该标签,但业务逻辑常要求统一为 0.0 或 None。ElementTree 默认把空标签当 text=None,而 lxml 的 etree.XMLParser(remove_blank_text=True) 可清理冗余空白,避免 text=" " 被误判为有效值。
本书全面介绍PHP脚本语言和MySOL数据库这两种目前最流行的开源软件,主要包括PHP和MySQL基本概念、PHP扩展与应用库、日期和时间功能、PHP数据对象扩展、PHP的mysqli扩展、MySQL 5的存储例程、解发器和视图等。本书帮助读者学习PHP编程语言和MySQL数据库服务器的最佳实践,了解如何创建数据库驱动的动态Web应用程序。
- 混合内容(如
)不能靠Hello world.
elem.text全取,得遍历elem.itertext()或拼接elem.text + elem.tail - 命名空间 URI 写错一个字符(如
http://example.com/nsvshttps://example.com/ns),整个find()就返回None - 用
xmlschema(Python)或XSDValidator(Java)做预校验,比解析时报ParseError更早暴露结构问题
别把 XML 当通用存储,复杂嵌套优先考虑 JSON Schema + 验证
XML 天然适合带命名空间、混合内容、注释和处理指令的场景(如 SOAP、OpenOffice 文档、RSS),但现代 API 和配置文件几乎都转向 JSON。如果只是传输扁平对象列表,硬套 不仅冗长,还让 XPath 查询成本远高于 JSONPath。
真正需要 XML 映射时,核心是守住两点:一是用 schema 或 DTD 锁定结构边界,二是把解析逻辑封装成纯函数,输入 bytes 或 io.BytesIO,输出 domain model,中间不掺杂 I/O 或日志——否则调试时分不清是网络超时还是标签名拼错了。









