贝利信息

Delphi/C++ Builder怎么解析XML

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

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

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())。

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)

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

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

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