Java XML转Map工具类 递归将XML解析为Map嵌套结构

幻夢星雲

幻夢星雲

2026-03-21

520人浏览

原创

最可靠方式是用documentbuilder解析xml后手写递归函数转map:属性加@前缀、文本用#text键、空元素设为null,需过滤非element_node、合并text_node、单独处理attribute。

java xml转map工具类 递归将xml解析为map嵌套结构

DocumentBuilder 解析 XML 字符串再递归转 Map 最可靠

Java 原生没有直接把 XML 转成嵌套 Map 的标准 API,硬套 JAXB 或第三方库(比如 xmltojson)容易在属性/文本混用、同名子节点、空元素等场景翻车。最可控的方式是自己用 DocumentBuilder 解析成 Document,再写一个轻量递归函数遍历节点。

关键不是“能不能转”,而是“怎么让 <user id="123"><name>Tom</name></user> 变成 {"user": {"@id": "123", "name": "Tom"}} 这种结构——属性加 @ 前缀、文本内容用 #text 键、子节点自动嵌套,都得手动约定清楚。

  • 别用 SAXParser:回调式写法对嵌套结构维护成本高,容易漏层级
  • 别跳过 DocumentBuilder.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true):防 XXE 攻击,尤其输入不可信时
  • 空元素如 <email></email> 建议统一转成 {"email": null},而不是忽略或空字符串,否则下游 map.get("email") == null 语义模糊

parseNode 递归函数里必须处理三类节点:Element、Text、Attribute

XML 节点类型不只有 ElementText 节点(即标签内纯文本)和 Attribute(属性)必须分开处理,否则会把属性值当子节点、把换行当内容。

典型错误是只遍历 getChildNodes(),结果把文本节点(含缩进和换行)也塞进 Map,造成 {"#text": "\n "} 这种脏数据。

  • node.getNodeType() == Node.ELEMENT_NODE 过滤,跳过 TEXT_NODECOMMENT_NODE
  • 属性用 element.getAttributes() 单独取,每个 Attr 的 key 是 "@" + attr.getName(),value 是 attr.getValue()
  • 元素内的纯文本(非子标签)要合并:遍历所有直接子 TEXT_NODEtrim() 后拼接,空则设为 null,键固定为 "#text"

示例片段:

Android系统中XML解析的实践 中文WORD版
Android系统中XML解析的实践 中文WORD版

本文档主要讲述的是Android系统中XML解析的实践;希望对大家的学习会有帮助;感兴趣的朋友可以过来看看

下载
private Map<string object> parseNode(Node node) {
    if (node.getNodeType() != Node.ELEMENT_NODE) return Collections.emptyMap();
    Element elem = (Element) node;
    Map<string object> map = new LinkedHashMap();
    // 处理属性
    NamedNodeMap attrs = elem.getAttributes();
    for (int i = 0; i 

<h3>同名子节点(如多个 <code><item></item></code>)必须转成 <code>List</code>,不能覆盖</h3>
<p>这是最容易被忽略的坑:XML 允许多个同名子节点,但 <code>Map</code> 的 key 是唯一的。如果代码里直接 <code>map.put("item", value)</code>,后一个会覆盖前一个,数据直接丢。</p>
<p>判断逻辑很简单——插入前先查 key 是否已存在。但要注意,第一次是单个 <code>Object</code>,第二次才升格为 <code>List<object></object></code>,第三次往 list 里 add 就行。</p>
<ul>
<li>别用 <code>instanceof ArrayList</code> 判定,用 <code>map.get(key) instanceof List</code> 更稳妥</li>
<li>如果业务确定某个标签永远只有一个,可加白名单跳过 list 化(比如 <code>"config"</code>),但默认行为必须保守</li>
<li>测试用例一定要包含 <code><list><item>a</item><item>b</item></list></code>,验证输出是 <code>{"list": {"item": ["a", "b"]}}</code>
</li>
</ul>
<h3>字符编码和命名空间不处理会导致解析失败或乱码</h3>
<p>XML 声明里带 <code>encoding="GBK"</code>,但 <code>DocumentBuilder</code> 默认按 UTF-8 读,字节流一解码就错;还有带命名空间的 XML(<code><root xmlns:ns="http://example.com"></root></code>),不设置 <code>setNamespaceAware(true)</code>,<code>getNodeName()</code> 返回的是 <code>ns:root</code> 还是 <code>root</code> 都不确定。</p>
<ul>
<li>构造 <code>InputSource</code> 时显式指定编码:<pre class="brush:php;toolbar:false;">InputSource src = new InputSource(new ByteArrayInputStream(xmlBytes));
src.setEncoding("UTF-8"); // 或从 XML 声明里动态提取
  • 必须调用 dbFactory.setNamespaceAware(true),否则带前缀的标签名解析异常,且 getAttributes() 可能漏掉命名空间声明属性
  • 如果 XML 没声明 encoding,又不确定来源编码,建议统一转 UTF-8 再解析,避免依赖平台默认编码
  • 复杂点在于,真实 XML 往往混合了 CDATA、实体引用(<)、注释,这些在 getTextContent() 中已自动解码,但如果你改用 getNodeValue() 就会拿到原始未解码字符串——这点很容易被忽略,导致   显示成字面量。

    Java免费学习笔记:立即使用
    解锁 Java 大师之旅:从入门到精通的终极指南

    相关文章

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    xml解析

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    c语言中null和NULL的区别
    c语言中null和NULL的区别

    c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

    2023.09.22

    418

    3

    java中null的用法
    java中null的用法

    在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

    2024.03.01

    1485

    6

    pdf怎么转换成xml格式
    pdf怎么转换成xml格式

    将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

    2024.04.01

    2759

    5

    xml怎么变成word
    xml怎么变成word

    步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

    2024.08.01

    3337

    7

    xml是什么格式的文件
    xml是什么格式的文件

    xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

    2024.11.28

    1772

    7

    js 字符串转数组
    js 字符串转数组

    js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

    2023.08.03

    1151

    5

    js截取字符串的方法
    js截取字符串的方法

    js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

    2023.09.04

    1190

    5

    java基础知识汇总
    java基础知识汇总

    java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

    2023.10.24

    3264

    49

    字符串介绍
    字符串介绍

    字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

    2023.11.24

    2144

    6

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    热门推荐
    /
    最新课程
    phpStudy极速入门视频教程
    phpStudy极速入门视频教程

    共6课时 | 54.4万人学习

    独孤九贱(4)_PHP视频教程
    独孤九贱(4)_PHP视频教程

    共89课时 | 131.8万人学习