0

0

Node.js fast-xml-parser库的使用

月夜之吻

月夜之吻

发布时间:2026-01-14 09:42:10

|

663人浏览过

|

来源于php中文网

原创

fast-xml-parser 解析失败主因是输入非法XML或含BOM/注释/DOCTYPE等默认不支持内容;需按需配置ignoreDeclaration、ignoreComment等选项,并注意parseTagValue/parseAttributeValue对结构的影响。

node.js fast-xml-parser库的使用

fast-xml-parser 解析 XML 字符串失败,返回空对象或报错

常见原因是输入不是合法 XML,或含 BOM、注释、DOCTYPE 等 fast-xml-parser 默认不处理的内容。它默认只解析标准格式的 XML,且不支持 DTD 和 CDATA(除非显式开启)。

  • 检查原始字符串是否以 开头,或至少以 类标签起始;用 console.log(JSON.stringify(xmlStr.slice(0, 50))) 看前 50 字符,确认无隐藏 BOM(如 \uFEFF
  • 若 XML 含注释(),需启用 ignoreDeclaration: falseignoreAttributes: false,并设 ignoreComment: false
  • 若含 /code>,必须设 ignoreDeclaration: true(否则直接抛 Invalid XML: DOCTYPE is not supported
const { parse } = require('fast-xml-parser');
const options = {
  ignoreAttributes: false,
  ignoreDeclaration: true,
  ignoreComment: false,
  ignoreCdata: false,
  parseTagValue: true,
  parseAttributeValue: true
};
const result = parse(xmlString, options); // 不再因注释/DOCTYPE 崩溃

如何保留 XML 中的属性和文本混合结构

fast-xml-parser 默认把属性转成带 @_ 前缀的键,文本内容则放在 #text 键下。但若没开 parseTagValueparseAttributeValue,所有值都会是字符串,无法区分属性与子节点文本。

  • parseTagValue: true 才会把纯文本子节点(如 Alice)的值提取为字符串,否则整个 节点会是空对象
  • parseAttributeValue: true 才能把 中的 id 解析为 { "@_id": "123" },否则属性被完全忽略
  • 若需扁平化(如把 @_id 直接变 id),得后处理:遍历对象,用 Object.keys().filter(k => k.startsWith('@_')) 提取并重命名

解析大文件时内存溢出或卡死

fast-xml-parser 是纯内存解析器,不支持流式(streaming)或 SAX 模式。XML 超过几 MB 就可能触发 Node.js 内存限制(默认 1.4GB),尤其当启用了 ignoreAttributes: false 生成大量嵌套对象时。

MyBatis3.2.3帮助文档 中文CHM版
MyBatis3.2.3帮助文档 中文CHM版

MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(Plan Old Java Objects,普通的 Java 对象)映射成数据库中的记录。有需要的朋友可以下载看看

下载
  • process.memoryUsage().heapUsed / 1024 / 1024 监控解析前后内存变化
  • 对 >2MB 的 XML,优先考虑改用 saxlibxmljs 这类流式库;若必须用 fast-xml-parser,先用 fs.readFileSync 读取后做简单校验(如统计 出现次数),避免无效大文件进解析流程
  • 禁用不必要的选项:如确定无属性,设 ignoreAttributes: true 可减少 30%+ 对象创建量

从 JSON 再序列化回 XML 时格式错乱或丢失信息

fast-xml-parserrender 方法不保证 round-trip 精确还原:它不会保留原始缩进、换行、属性顺序,且对 #text@_ 键的处理有隐含规则。

  • 若源 XML 有同名兄弟节点(如多个 ),解析后是数组;但若只有一个,解析结果是单个对象——render 时不会自动补成数组,导致结构不一致
  • 解决办法:解析后统一用 Array.isArray(obj.item) ? obj.item : [obj.item] 规范化,再传给 render
  • render 不处理 undefined 值,但会把 null 渲染为 ;若要跳过空字段,需提前过滤:JSON.parse(JSON.stringify(obj, (k, v) => v == null ? undefined : v))
const { render } = require('fast-xml-parser');
const normalized = {
  root: {
    item: Array.isArray(parsed.root.item) 
      ? parsed.root.item 
      : [parsed.root.item]
  }
};
const xmlOut = render(normalized); // 避免单元素 vs 多元素歧义

解析 XML 的边界比看起来多:BOM、属性命名、兄弟节点数量、内存模型、序列化语义——这些点不提前对齐,调试时容易陷入“为什么这里没数据”的循环。

相关专题

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

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

411

2023.08.07

json是什么
json是什么

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

532

2023.08.23

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

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

309

2023.10.13

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

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

74

2025.09.10

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

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

231

2023.09.22

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

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

435

2024.03.01

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

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

1874

2024.04.01

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

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

2085

2024.08.01

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.13

热门下载

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

精品课程

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

共101课时 | 8.3万人学习

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

共39课时 | 3.2万人学习

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

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