0

0

XML到JSON的最简单映射方法

幻夢星雲

幻夢星雲

发布时间:2026-02-07 02:23:09

|

230人浏览过

|

来源于php中文网

原创

XML转扁平JSON首选xml2js(ignoreAttrs: true),禁用JSON.stringify(XMLDocument);复杂场景用fast-xml-parser;浏览器端可DOM API应急但限制多。

xml到json的最简单映射方法

XML字符串直接转为扁平JSON对象(无嵌套)

如果XML结构简单、没有重复标签、不关心属性和文本混合,xml2js 的默认解析器配合 ignoreAttrs: truemergeAttrs: false 是最轻量的路径。它把每个元素转成键值对,值是其文本内容,忽略所有属性。

常见错误:直接用 JSON.stringify(xmlDoc) —— 浏览器原生 XMLDocument 对象不能这样序列化,会得到空对象或报错 TypeError: Converting circular structure to JSON

  • 适用场景:配置文件、单层API响应(如 ok200
  • 不适用:含同名子节点(如多个 )、含属性()、含 CDATA 或注释
  • 性能影响:小XML(xml2js.Parser({ async: true }))

保留属性和文本内容的通用映射(推荐默认方案)

真实XML往往含属性(idtype)和混合内容(文本+子节点),此时必须区分 #text@attributes。用 xml2js 配置 explicitArray: falseexplicitChildren: true 可避免冗余数组包装,让结构更贴近直觉。

const xml2js = require('xml2js');
const parser = new xml2js.Parser({
  explicitArray: false,
  explicitChildren: true,
  childkey: '$',
  charsAsChildren: true,
  mergeAttrs: true
});

// 输入:Tom30
// 输出:{ user: { $: { id: "123" }, name: "Tom", age: "30" } }

关键点:

  • $ 键固定存放属性(由 childkey: '$' 指定),避免与子元素名冲突
  • charsAsChildren: true 确保纯文本节点也作为子项出现,否则顶层文本会被丢弃
  • 若XML有多个同名子节点(如 AB),explicitArray: false 会把它变成对象而非数组 —— 这是坑,需手动检测类型再归一化

处理重复子节点( 多次出现)

XML中重复标签是常见痛点:xml2js 默认把多个 合并为一个对象(只保留最后一个),除非启用 explicitArray: true。但开启后所有子节点都变数组,哪怕只有一个 —— 不够干净。

折中做法:保持 explicitArray: false,解析后递归扫描值是否为数组,对已知重复标签(如 itementry)做后处理:

PageAdmin企业网站管理系统4.0.25
PageAdmin企业网站管理系统4.0.25

PageAdmin企业网站管理系统V4.0,基于微软最新的MVC框架全新开发,强大的后台管理功能,良好的用户操作体验,可热插拔的插件功能让扩展更加灵活和开放,全部信息表采用自定义表单,可任意自定义扩展字段,支持一对一,一对多的表映射.....各种简单到复杂的网站都可以轻松应付。 PageAdmin V4.0.25更新日志: 1、重写子栏目功能,解决之前版本子栏目数据可能重复的问题 2

下载
function normalizeRepeated(obj, keys = ['item', 'entry']) {
  if (obj == null || typeof obj !== 'object') return obj;
  for (const key of keys) {
    if (Array.isArray(obj[key])) continue;
    if (obj[key] !== undefined && !Array.isArray(obj[key])) {
      obj[key] = [obj[key]];
    }
  }
  Object.keys(obj).forEach(k => obj[k] = normalizeRepeated(obj[k], keys));
  return obj;
}

注意:

  • 必须在 parser.parseString 回调里调用,不能对原始XML字符串操作
  • 如果XML层级深且重复标签多,此函数需加循环深度限制,否则溢出
  • 浏览器端可用 fast-xml-parser 替代,它原生支持 ignoreAttributes: false + arrayMode: 'strict',无需后处理

浏览器环境零依赖方案(仅限简单XML)

不想引入 xml2jsfast-xml-parser?DOM API 可应急,但仅适用于格式良好、无命名空间、无DOCTYPE 声明的XML字符串。

步骤:用 DOMParser 解析 → 递归遍历 Element 节点 → 手动构造JSON对象。核心逻辑如下:

function xmlToJSON(xmlStr) {
  const doc = new DOMParser().parseFromString(xmlStr, 'application/xml');
  if (doc.querySelector('parsererror')) throw new Error('Invalid XML');
  
  function walk(node) {
    if (node.nodeType !== Node.ELEMENT_NODE) return null;
    
    const obj = {};
    // 属性
    for (let attr of node.attributes) {
      obj['@' + attr.name] = attr.value;
    }
    // 子节点文本或元素
    let children = Array.from(node.childNodes)
      .map(n => n.nodeType === Node.TEXT_NODE ? n.textContent.trim() : walk(n))
      .filter(x => x != null && x !== '');
    
    if (children.length === 0) {
      // 纯空元素,返回 null 或 '',按需调整
      return obj;
    }
    if (children.length === 1 && typeof children[0] === 'string') {
      obj['#text'] = children[0];
    } else {
      Object.assign(obj, Object.assign({}, ...children));
    }
    return { [node.nodeName]: obj };
  }
  return walk(doc.documentElement);
}

限制明显:

  • 无法处理命名空间( 会被当成 ns:item 键名)
  • 属性名加 @ 前缀是惯例,但和 xml2js$ 不兼容,跨环境需统一约定
  • 遇到 时,textContent 会包含 字符串,需正则清洗

真正复杂或高频的XML/JSON互转,别省那几十KB包体积——选 fast-xml-parser,它的 parse 方法默认就处理重复标签、属性、CDATA 和注释,且无依赖、TypeScript友好。手写解析器容易在边缘情况翻车,比如自闭合标签 XML到JSON的最简单映射方法 或带前导空格的文本节点。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

430

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

541

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

313

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

79

2025.09.10

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

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

1915

2024.04.01

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

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

2098

2024.08.01

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

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

1103

2024.11.28

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

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

403

2023.08.03

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.02.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 8.9万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 3.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号