讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

Laper
Laper

剧本策划到成片协作

Seko
Seko

AI短剧一键生成成片

updream

一键生成高质量推广成片

Delphi/C++ Builder怎么解析XML

云明同学_5726

云明同学_5726

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

|

239人浏览过

|

来源于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 才能加载内容,否则 DocumentElement 为 nil。

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

GitHub操作助手
GitHub操作助手

用大白话操作当前项目的 Git/GitHub——配置 GitHub(装 gh CLI + 登录 + 建仓库)、备份、拉取下载、查询历史、回滚代码、管理分支。当用户用日常语言表达 git 意图时触发(例如"git备份一下""git下载项目""git拉下来""git看看我改了啥""git回退到上一个版本""git新建个分支搞新功能""git合并到主分支""git

下载

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

  • 在非主线程中使用 IXMLDocument 前,必须先调用 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)
  • 不要跨线程传递 IXMLNode 指针 —— 接口引用计数在线程间不同步,极易崩溃
  • 释放顺序:先置 Active = false,再 Free 或让接口变量离开作用域;重复 Free 或 Release 会导致 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大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

549

2023.09.22

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

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

1698

2024.03.01

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

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

5044

2024.04.01

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

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

6557

2024.08.01

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

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

2622

2024.11.28

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

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

1898

2023.08.03

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

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

3104

2023.09.04

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

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

6344

2023.10.24

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Postman Native Git工作流指南
Postman Native Git工作流指南

共0课时 | 0人学习

vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 8.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn