0

0

Delphi读写XML文件 Delphi操作XMLDocument组件

月夜之吻

月夜之吻

发布时间:2026-03-17 12:27:59

|

474人浏览过

|

来源于php中文网

原创

XMLDocument.LoadFromFile报“Invalid XML”主因是UTF-8 BOM与encoding声明冲突;写入乱码因未设Encoding:=‘UTF-8’且误用Node.Text;跨平台须弃用TXMLDocument改用TXMLParser或OmniXML。

delphi读写xml文件 delphi操作xmldocument组件

XMLDocument.LoadFromFile 报“Invalid XML”但文件明明能用浏览器打开

Delphi 的 XMLDocument 默认使用 MSXML 解析器(Windows 平台),对编码声明和 BOM 敏感。常见错误是 XML 文件以 UTF-8 BOM 开头,但声明却是 <?xml version="1.0" encoding="UTF-8"?> —— MSXML 会认为 BOM 和声明冲突,直接报错。

实操建议:

  • 用记事本或 VS Code 查看文件真实编码:右下角显示 “UTF-8 with BOM” 就要处理
  • 保存为纯 UTF-8(无 BOM)再加载,或改用 LoadFromStream 配合手动指定编码
  • 更稳妥的做法:用 TStringList.LoadFromFile(..., TEncoding.UTF8) 读入字符串,再调用 XMLDocument.LoadFromXML
  • 避免依赖系统默认解析器:在设计时勾选 XMLDocument.Options → foNoNamespacePrefixfoIgnoreWhiteSpace,减少解析歧义

写入 XML 后中文乱码或被转义成 安全

根本原因不是 Delphi 编码问题,而是 XMLDocument 默认把所有非 ASCII 字符做字符实体编码(xxx;),且输出时不写 encoding 声明,导致外部工具按系统默认编码(如 GBK)解析失败。

实操建议:

  • 写入前必须设置:XMLDocument.Encoding := 'UTF-8'(注意大小写,写成 'utf-8' 无效)
  • 调用 XMLDocument.SaveToFile 前,确保根节点的 XMLDocument.XML.Text 已含正确声明,例如:<?xml version="1.0" encoding="UTF-8"?>
  • 不要用 Node.Text := '中文' 直接赋值,改用 Node.NodeValue := '中文',避免自动转义
  • 如果仍出现 ...,检查是否误用了 Node.InnerText —— 它会强制转义,Node.NodeValue 才保留原始字符

遍历 TDOMNode 时 Access Violation 或节点数为 0

Delphi 的 XMLDocument 是基于 COM 的封装,节点对象生命周期依赖于文档实例。常见错误是提前释放文档、跨线程访问、或用错遍历方式(比如用 ChildNodes.Count 却忽略文本节点干扰)。

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载

实操建议:

  • 确保 XMLDocument.Active := True 且未被 FreeDestroy;若需长期持有节点,用 Node.CloneNode(True)
  • 遍历子节点时别只看 ChildNodes.Count,先过滤掉空白文本节点:if Node.ChildNodes[i].NodeType = ntElementNode then ...
  • 避免在循环中修改 ChildNodes(如删除节点),改用倒序遍历:for i := Node.ChildNodes.Count - 1 downto 0 do
  • 调试时用 Node.XML 查看实际结构,比依赖 IDE 对象查看器更可靠

在非 Windows 平台(macOS/Linux)用 TXMLDocument 编译失败

Delphi 的 TXMLDocument 组件底层绑定 MSXML(Windows-only),Linux/macOS 上编译会提示 Unit XMLDoc not found 或链接错误,不是配置问题,是平台限制。

实操建议:

  • 跨平台项目必须弃用 TXMLDocument,改用 TXMLParser + 手动构建 DOM,或引入第三方库如 OmniXML
  • 若坚持用原生方案:Windows 用 TXMLDocument,其他平台用 TStringList + 正则/字符串操作(仅限格式简单、无嵌套的配置场景)
  • 注意 XMLDoc 单元在非 Windows 下不参与编译,条件编译不可靠,应在项目选项里直接排除该单元引用

XMLDocument 的坑大多藏在编码声明、节点生命周期和平台绑定这三处。写完记得用外部工具(如 Notepad++ 的“编码检测”或在线 XML 校验器)反向验证生成文件,比只信 Delphi 的 SaveToFile 更靠谱。

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

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

847

2023.08.22

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

203

2023.11.20

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

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

1950

2024.04.01

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

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

2119

2024.08.01

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

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

1178

2024.11.28

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

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

761

2023.08.03

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

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

221

2023.09.04

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

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

1570

2023.10.24

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

1

2026.03.17

热门下载

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

精品课程

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

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