0

0

Delphi/C++ Builder怎么解析XML

幻夢星雲

幻夢星雲

发布时间:2026-01-26 09:16:39

|

159人浏览过

|

来源于php中文网

原创

Delphi和C++ Builder解析XML主要依赖IXMLDocument/TXMLDocument,底层用MSXML或libxml2;VCL内置支持轻量但不支持XPath 1.0全功能;需注意Active设置、编码声明、节点遍历方式及COM线程安全。

delphi/c++ builder怎么解析xml

Delphi 和 C++ Builder 解析 XML 主要靠 IXMLDocument(Delphi)或 IXMLDocument / TXMLDocument(C++ Builder),底层依赖 MSXML(Windows)或开源库(如 libxml2,需手动集成)。默认安装的 VCL 框架已内置轻量级 XML 支持,够用但不支持 XPath 1.0 全功能或命名空间高级解析。

Delphi 中用 TXMLDocument 加载和遍历节点

推荐使用设计时组件 TXMLDocument(VCL)或运行时创建 IXMLDocument 接口。注意:必须设置 Active := True 才能加载内容,否则 DocumentElementnil

  • LoadFromFile()LoadFromXML() 都会触发解析,但前者要求文件存在且编码匹配(建议 UTF-8 + BOM)
  • 节点遍历优先用 ChildNodes 而非 FirstChild,避免忽略文本节点或注释
  • 获取属性值用 Node.Attributes['attrname'],不是 Node.AttributeNodes['attrname'].Text(后者在某些版本中返回空)
  • 中文内容乱码常见于未声明编码或 BOM 缺失 —— 在 XML 字符串开头加
var
  XML: IXMLDocument;
  Root, Node: IXMLNode;
begin
  XML := LoadXMLData('你好');
  Root := XML.DocumentElement;
  Node := Root.ChildNodes['item'];
  if Node <> nil then
    ShowMessage(Node.Text); // 输出:你好
    ShowMessage(Node.Attributes['id']); // 输出:1
end;

C++ Builder 中 TXMLDocument 的典型用法

C++ Builder 的 TXMLDocument 是封装类,比纯接口更易用,但需注意构造方式和内存管理。不能直接 new,应通过窗体设计器拖入或用 new TXMLDocument(NULL) 创建(Owner 为 NULL 时需手动 Free())。

  • 调用 LoadFromFile() 前必须设 Active = false,否则抛异常 “XML document already active”
  • DocumentElement->ChildNodes->Nodes[i] 是访问子节点的常用路径,Nodes[] 索引从 0 开始,不跳过空白文本节点
  • 属性读取用 Node->Attributes->GetNodeValue("attr"),不是 Node->GetAttribute("attr")(后者在较新版本中已弃用)
  • 若 XML 含命名空间(如 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"),默认解析器会忽略前缀,无法用 ChildNodes['xsi:schemaLocation'] 直接访问
TXMLDocument* XML = new TXMLDocument(this);
XML->Active = false;
XML->LoadFromFile("data.xml");
XML->Active = true;
IXMLNode* Root = XML->DocumentElement;
IXMLNode* Item = Root->ChildNodes->Nodes[0];
if (Item)
  Memo1->Lines->Add(Item->Text);
  Memo1->Lines->Add(Item->Attributes->GetNodeValue("id"));

遇到“Access violation”或“Interface not supported”错误怎么办

这类错误基本源于 COM 接口生命周期失控或线程误用。Delphi/C++ Builder 的 XML 组件基于 MSXML(Windows 平台),要求 COM 初始化(VCL 应用通常自动完成),但控制台程序或子线程中需手动调用 CoInitialize(nil)

黑点工具
黑点工具

在线工具导航网站,免费使用无需注册,快速使用无门槛。

下载

立即学习C++免费学习笔记(深入)”;

  • 在非主线程中使用 IXMLDocument 前,必须先调用 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)
  • 不要跨线程传递 IXMLNode 指针 —— 接口引用计数在线程间不同步,极易崩溃
  • 释放顺序:先置 Active = false,再 Free 或让接口变量离开作用域;重复 FreeRelease 会导致 AV
  • 如果 XML 内容来自网络或不可信来源,务必用 try..except 包裹 LoadFromXML(),MSXML 对格式错误极其敏感(如未闭合标签、非法字符)

需要 XPath 或更健壮解析时怎么选

原生 TXMLDocument 不支持 XPath 查询(SelectNodes() 返回空),也不支持 DTD 验证或 XSLT。真有这些需求,别硬改,直接换:

  • Windows 下可用 MSXML2.DOMDocument60 COM 对象(需 import 类型库),支持完整 XPath 1.0 和命名空间前缀绑定
  • 跨平台方案:集成 libxml2(C++ Builder 可用静态链接版),Delphi 有第三方封装如 XmlParser(GitHub 开源)
  • 简单场景下,正则提取 + StringReplace 处理固定结构 XML,比引入大库更快更稳(仅限无嵌套、无转义、无 CDATA 的配置片段)

真正麻烦的从来不是“怎么解析”,而是“XML 本身是否规范”——比如服务端返回的响应混用了   实体但没声明 DTD,或者时间字段用了 2024-05-20T14:30:00+08:00 格式却漏了时区声明。这些细节不处理,接口再漂亮也白搭。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

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

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

235

2023.09.22

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

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

437

2024.03.01

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

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

1897

2024.04.01

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

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

2091

2024.08.01

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

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

1051

2024.11.28

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

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

298

2023.08.03

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

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

212

2023.09.04

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

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

1498

2023.10.24

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

31

2026.01.26

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.5万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 0人学习

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

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