xml 数据格式是一种可扩展标记语言,核心作用是以纯文本方式存储传输结构化数据,人和程序都可以读懂,跨平台兼容性很强,很多配置文件接口报文文档交换场景都会使用 xml 数据格式。xml 数据格式本身只定义书写规则,不规定固定标签名称,开发者可以根据业务自定义标签,这也是它和 json 这类格式最大的区别,正因为标签可以自定义,不同业务的 xml 结构差异很大,解析的时候必须提前知道对应的标签层级。想要完成 xml 数据格式解析,第一步确认 xml 文件或者报文是否语法合法,第二步选择对应的解析库,第三步加载 xml 数据源,第四步遍历节点读取属性和文本内容,第五步处理异常报错,最后输出解析后的业务数据。综合来看 xml 数据格式解析本质就是把标签嵌套的文本结构转换成程序内部对象,重点要掌握节点属性子节点命名空间这些概念,同时要提前规避语法错误带来的解析失败。
xml 数据格式核心组成要素
标签 每一对标签都有开始标签和结束标签,标签名称自定义,区分大小写,例如 user name 这类自定义标签,大小写不同会被识别成两个不同节点。
属性 写在开始标签内部,用来补充节点附加信息,格式是名称等于值,属性值必须加引号,一个节点可以设置多个属性。
文本内容 放在开始标签和结束标签中间,就是节点里面的文字数据。
嵌套层级 xml 依靠标签嵌套表达父子关系,子节点必须完整闭合在父节点内部,不能交叉错位,这是 xml 语法最基础的硬性要求。
声明 一般放在文档第一行,用来声明 xml 版本编码格式,常用编码是 utf8。
命名空间 当多套自定义标签重名的时候,使用命名空间做区分,复杂业务 xml 数据格式解析经常会遇到命名空间,也是新手最容易出错的部分。
两种主流 xml 解析模式对比
| 解析模式 | 工作原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| DOM 解析 | 一次性把整个 xml 加载进内存,生成完整节点树,可以随机访问任意节点 | 支持修改删除新增节点,操作灵活 | 大文件占用内存很高 | 中小体积 xml,需要修改 xml 内容 |
| SAX 解析 | 流式逐行读取,边读边触发事件回调,不会把全部内容载入内存 | 内存占用低,适合超大 xml 文件 | 只能顺序读取,不能随机访问,不方便修改 | 超大 xml 文件只读解析 |
xml 数据格式解析实操步骤
第一步 校验 xml 合法性,检查标签有没有闭合,引号有没有缺失,标签有没有交叉嵌套,编码声明是否正确,非法 xml 会直接解析报错。
第二步 选择解析工具,Python 可以使用 xml.etree.ElementTree,Java 可以使用 JDK 自带 DOM 或者 SAX,前端 JS 可以使用 DOMParser,C 可以使用 XmlDocument。
第三步 加载数据源,数据源可以是本地 xml 文件,也可以是网络接口返回的 xml 字符串报文。
第四步 定位根节点,所有 xml 都只有一个根节点,所有业务数据都挂载在根节点下面,从根节点开始向下查找子节点。
第五步 读取数据,区分是读取节点内部文本,还是读取节点上的属性值,遇到多层嵌套需要循环遍历子节点列表。
第六步 异常处理,增加捕获逻辑,处理文件不存在编码错误命名空间找不到节点这类异常,防止程序直接崩溃。
第七步 结果转换,解析完成之后可以按需转换成字典对象或者业务实体类,方便后续业务代码使用。
常见解析坑点
第一 大小写敏感,UserName 和 username 在 xml 里面属于两个不同节点,查找的时候名称写错就会提示节点不存在。
第二 空白换行空格,xml 文本节点经常会带换行空白字符,解析出来的文本需要做 trim 清理。
第三 特殊字符转义,xml 里面小于号大于号和符号本身有特殊含义,如果业务文本包含这些字符,必须提前转义,否则解析失败。
第四 命名空间前缀,很多 xml 标签前面带前缀,查找节点的时候不能只写标签名,必须带上命名空间,否则定位失败。
第五 大文件不要强行使用 DOM 解析,文件几十兆以上 DOM 会占用大量内存,优先切换 SAX 流式解析。
【常见问题】
问题 1 xml 数据格式解析和 json 解析有什么区别
回答 1 xml 数据格式解析是处理带标签嵌套的文本结构,标签可以自定义还支持属性命名空间,json 解析是处理键值对数组结构,写法更简洁,xml 数据格式解析适合需要属性和复杂文档结构的场景,json 更适合轻量接口传输。
问题 2 xml 数据格式解析报错根节点不匹配是什么原因
回答 2 xml 数据格式解析报错根节点不匹配,一般是代码里面查找的根标签名称和 xml 实际根标签名称不一致,或者 xml 存在多个根节点,xml 规范要求只能有唯一根节点,检查标签名称大小写和文档结构就能定位问题。
问题 3 xml 数据格式解析能不能读取节点里面的属性
回答 3 xml 数据格式解析可以读取节点里面的属性,属性写在开始标签内部,解析库都提供获取属性的方法,和读取节点文本是两套独立取值方式,xml 数据格式解析的时候要区分清楚是取文本还是取属性。
问题 4 xml 数据格式解析大文件为什么内存暴涨
回答 4 xml 数据格式解析如果使用 DOM 模式,会把全部 xml 内容构建成完整节点树放在内存,文件越大内存占用越高,xml 数据格式解析大文件建议改用 SAX 流式解析,边读取边处理,不需要一次性载入全部数据。
【免责申明】
本文 xml 数据格式解析相关内容仅为技术原理通用讲解,不同编程语言解析库接口存在差异,实际开发请参考对应语言官方文档,业务生产环境需要额外完善安全校验,防范 xml 外部实体注入风险。


