如何在Delphi 7中使用MSXML 6.0创建TXML文档?

3

在Delphi 7发布时,MSXML 6.0 不存在。是否可能配置Delphi的TXML文档以使用MSXML 6.0而不是旧版本?

2个回答

10

将以下代码添加到一个名为uMSXMLVersion或您选择的名称的单元中,并将其添加到您的项目uses中

{----------------------------------------------------------------------------    
  Set Delphi's XMLDocument to use MSXML v6.0

  Usage:  Include unit in project "uses"-list and Delphi will automatically use
          MSXML v6.0 for TXmlDocument.
-----------------------------------------------------------------------------}
unit uMSXMLVersion;

interface

implementation

uses ActiveX, MSXML, MSXMLDOM;

function CreateDOMDocumentEx: IXMLDOMDocument;
const
  CLASS_DOMDocument60: TGUID = '{88D96A05-F192-11D4-A65F-0040963251E5}';
begin
  Result := nil;
  if CoCreateInstance(CLASS_DOMDocument60, nil, CLSCTX_INPROC_SERVER or
    CLSCTX_LOCAL_SERVER, IXMLDOMDocument, Result) <> S_OK then
  Result := CreateDOMDocument; //call the default implementation
end;

initialization
  MSXMLDOMDocumentCreate := CreateDOMDocumentEx;

end.

重新分配函数的好技巧。我不知道在 Delphi 中可以使用这种动态语言技巧。更好的是,我正在处理的遗留代码的创建者们也不知道这个技巧 :-) - neves
[致命错误] uMSXMLVersion.pas(13): 在Delphi 7 Personal Edition中未找到文件'MSXML.dcu'。我缺少了什么? - Slappy

9

msxmldom.pas单元公开了一个名为MSXMLDOMDocumentCreate的公共钩子,您可以分配一个自定义处理程序,例如:

uses
  ..., msxmldom;

const
  CLASS_DOMDocument60: TGUID = '{88D96A05-F192-11D4-A65F-0040963251E5}';

function CreateMSXML6Document: IXMLDOMDocument;
var
  Disp: IDispatch;
begin
  OleCheck(CoCreateInstance(CLASS_DOMDocument60, nil, CLSCTX_INPROC_SERVER or CLSCTX_LOCAL_SERVER, IDispatch, Disp));
  Result := Disp as IXMLDOMDocument;
  if not Assigned(Result) then
    raise DOMException.Create('MSXML 6.0 Not Installed');
end;

initialization
  msxmldom.MSXMLDOMDocumentCreate := CreateMSXML6Document;

1
谢谢你的回答。我真的认为你的代码比 Fritz Deelman 的代码好一点,但他先回答了。 - neves

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接