xml在Delphi中的应用

合集下载

XML配置文件读取类[DELPHI]

XML配置文件读取类[DELPHI]

XML配置⽂件读取类[DELPHI]发现⽤INI做配置的话,实在有太多的东西难以描述,所以⾃⼰做了⼀个XML的配置⽂件存取类。

需要的同学可以直接拿去⽤,但希望尊重劳动成果,保留版权信息。

废话不多说,上代码!1unit XMLConfig;2{----------------------------------------------------------------------------}3{ 这个单元⽤来处理XML配置⽂件,对配置⽂件格式有默认要求 }4{ 格式为,只允许有⼀个root,然后root下对应配置⽂件, }5{ 所有配置,均使⽤xml属性存取配置,属性中必须存在Name属性, }6{ 不得单独使⽤下级Node }7{ PS: 使⽤NativeXML库作为XML取数基本集,NativeXML请⾃⾏获取 }8{ By Raymond.Zhang @ 2012.07.12 Mail: Acni.ray@ }9{ Tebs Work Group }10{----------------------------------------------------------------------------}11interface12uses13 NativeXml, System.Classes, System.SysUtils, CommLib,14 System.Generics.Collections;1516type1718 //为了⾃动释放的特性,使⽤接⼝19{$REGION 'Interface'}20 IConfigNode = interface21 ['{67323F7D-9E6C-420B-BF1C-92457D829380}']22function EnmuConfigNames: TStringList;23function EnmuConfigValues: TStringList;24function GetName: string;25function GetValueByConfig(AConfig: string): string;26function ValueWithDefault(AConfig: string; ADefualt: string):string;27procedure DeleteConfig(const AConfig: string);28procedure SetValueByConfig(AConfig: string; const Value: string);29property Value[AConfig: string]: string read GetValueByConfig write SetValueByConfig; default;30property Name: string read GetName;31end;3233 IConfigNodes = interface34 ['{56DBB6F5-BD64-4F07-A949-300877B1B787}']35function AddConfigNode(AName: string): IConfigNode;36function EnmuConfigNodes: TStringList;37function GetConfigNodeByIndex(AIndex: Integer): IConfigNode;38function GetConfigNodeByName(AName: string): IConfigNode;39function GetConfigNodeCount: Integer;40procedure DeleteConfig(AName: string);41property ConfigNode[AName: string]: IConfigNode read GetConfigNodeByName; default;42property Count: Integer read GetConfigNodeCount;43property Nodes[AIndex: Integer]: IConfigNode read GetConfigNodeByIndex;44end;4546 IRootNode = interface47 ['{65213F85-0804-4FE1-A726-CFC0F082AC93}']48function GetConfigsByType(AType: string): IConfigNodes;49property Configs[AType: string]: IConfigNodes read GetConfigsByType; default;50end;51{$ENDREGION}5253 TConfigNode = class(TInterfacedObject, IConfigNode)54private55 FXMLNode: TXmlNode;56function GetName: string;57protected58function GetValueByConfig(AConfig: string): string;59procedure SetValueByConfig(AConfig: string; const Value: string);60public61constructor Create(AXmlNode: TXmlNode);62destructor Destroy; override;63function EnmuConfigNames: TStringList;64function EnmuConfigValues: TStringList;65function ValueWithDefault(AConfig: string; ADefualt: string):string;66procedure DeleteConfig(const AConfig: string);67property Value[AConfig: string]: string read GetValueByConfig write SetValueByConfig; default;68property Name: string read GetName;69end;7071 TConfigNodes = class(TInterfacedObject, IConfigNodes)72private73 FType: string;74 FRootNode: TXmlNode;75 FXmlNodes: TList<TXmlNode>;76protected77function GetConfigNodeByIndex(AIndex: Integer): IConfigNode;78function GetConfigNodeByName(AName: string): IConfigNode;79function GetConfigNodeCount: Integer;80public81constructor Create(const ARootNode: TXmlNode; const AType: string);82destructor Destroy; override;83function AddConfigNode(AName: string): IConfigNode;84function EnmuConfigNodes: TStringList;85procedure DeleteConfig(AName: string);86property ConfigNode[AName: string]: IConfigNode read GetConfigNodeByName; default; 87property Count: Integer read GetConfigNodeCount;88property Nodes[AIndex: Integer]: IConfigNode read GetConfigNodeByIndex;89end;9091 TRootNode = class(TInterfacedObject, IRootNode)92private93 FRootNode: TXmlNode;94public95constructor Create(AXmlNode: TXmlNode);96destructor Destroy; override;97function GetConfigsByType(AType: string): IConfigNodes;98end;99100 TXMLConfig = class(TObject)101private102 FAutoSave: Boolean;103 FConfig: TNativeXml;104 FConfigName: string;105 FConfigPath: string;106protected107function GetRoot:IRootNode;108public109class function RegisterFileInfo(AFileInfo: IFileInfo): Boolean;110constructor Create(ConfigName: string);111destructor Destroy; override;112procedure Save;113property Root: IRootNode read GetRoot;114property AutoSave: Boolean read FAutoSave write FAutoSave;115end;116117implementation118var119 AppFileInfo: IFileInfo = nil;120const121 ConfigExt: string = '.config';122 UnRegFileInfo: string = '⽂件接⼝未注册,⽆法获取配置⽂件路径!';123124{ TXMLConfig }125126constructor TXMLConfig.Create(ConfigName: string);127begin128if Assigned(AppFileInfo) then129begin130inherited Create;131 FConfigName := ConfigName;132 FConfigPath := AppFileInfo.ConfigPath + ConfigName + ConfigExt;133 FConfig := TNativeXml.Create(nil);134 FConfig.Charset := 'utf-8';135 FConfig.XmlFormat := xfReadable;136 FAutoSave := True;137if FileExists(FConfigPath) then138 FConfig.LoadFromFile(FConfigPath)139else begin140 FConfig.VersionString := '1.0';141 := 'ConfigData';142 Save;143end;144end else145raise ERayException.Create(UnRegFileInfo);146end;147148destructor TXMLConfig.Destroy;149begin150if FAutoSave then Save;151 FreeAndNil(FConfig);152inherited;153end;154155function TXMLConfig.GetRoot: IRootNode;156begin157 Result := TRootNode.Create(FConfig.Root);158end;159160class function TXMLConfig.RegisterFileInfo(AFileInfo: IFileInfo): Boolean;161begin162 Result := Supports(AFileInfo, IFileInfo, AppFileInfo);163end;164165procedure TXMLConfig.Save;166begin167 FConfig.SaveToFile(FConfigPath);168end;169170{ TConfigNode }171172constructor TConfigNode.Create(AXmlNode: TXmlNode);173begin174inherited Create();175 FXMLNode := AXmlNode;176end;177178procedure TConfigNode.DeleteConfig(const AConfig: string);179begin180 FXMLNode.AttributeByName[UTF8Encode(AConfig)].Delete;181end;182183destructor TConfigNode.Destroy;184begin185 //这⾥不能释放Node,需要配合整个XML⼀起释放,若单独释放,会有意想不到的问题186 FXMLNode := nil;187inherited;188end;189190function TConfigNode.EnmuConfigNames: TStringList;191var192 I: Integer;193begin194 Result := TStringList.Create;195for I := 0to FXMLNode.AttributeCount - 1do196begin197 Result.Add(FXMLNode.Attributes[i].NameUnicode);198end;199end;200201function TConfigNode.EnmuConfigValues: TStringList;202var203 I: Integer;204begin205 Result := TStringList.Create;206for I := 0to FXMLNode.AttributeCount - 1do207begin208 Result.Add(FXMLNode.Attributes[i].ValueUnicode);209end;210end;211212function TConfigNode.GetName: string;213begin214 Result := FXMLNode.AttributeValueByNameWide['Name'];215end;216217function TConfigNode.GetValueByConfig(AConfig: string): string;218begin219 Result := FXMLNode.AttributeValueByNameWide[UTF8Encode(AConfig)];220end;221222procedure TConfigNode.SetValueByConfig(AConfig: string; const Value: string);223var224 AAttribute: TsdAttribute;225begin226 AAttribute := FXMLNode.AttributeByName[UTF8Encode(AConfig)];227if Assigned(AAttribute) then228begin229 AAttribute.ValueUnicode := Value;230end else231begin232 FXMLNode.AttributeAdd(UTF8Encode(AConfig), UTF8Encode(Value));233end;234 AAttribute := nil;235end;236237function TConfigNode.ValueWithDefault(AConfig, ADefualt: string): string;238begin239 Result := Value[AConfig];240if Result = EmptyStr then241begin242 Value[AConfig] := ADefualt;243 Result := ADefualt;244end;245end;246247{ TConfigNodes }248249function TConfigNodes.AddConfigNode(AName: string): IConfigNode;250var251 AXmlNode: TXmlNode;252begin253 Result := GetConfigNodeByName(AName);254if Result = nil then255begin256 AXmlNode := FRootNode.NodeNew(UTF8Encode(FType));257 AXmlNode.AttributeAdd('Name',UTF8Encode(AName));258 FXmlNodes.Add(AXmlNode);259 Result := TConfigNode.Create(AXmlNode);260end;261 AXmlNode := nil;262end;263264constructor TConfigNodes.Create(const ARootNode: TXmlNode; const AType: string); 265var266 I: Integer;267begin268inherited Create();269 FRootNode := ARootNode;270 FXmlNodes := TList<TXmlNode>.Create;271 FType := AType;272for I := 0to ARootNode.ElementCount - 1do273begin274if ARootNode.Elements[i].NameUnicode = AType then275begin276 FXmlNodes.Add(ARootNode.Elements[i]);277end;278end;279end;280281procedure TConfigNodes.DeleteConfig(AName: string);282var283 I: Integer;284begin285for I := 0to FXmlNodes.Count - 1do286begin287if FXmlNodes[i].AttributeValueByNameWide['Name'] = AName then288begin289 FXmlNodes[i].Delete;290 FXmlNodes.Delete(i);291 Exit;292end;293end;294end;295296destructor TConfigNodes.Destroy;297begin298 FreeAndNil(FXmlNodes);299inherited;300end;301302function TConfigNodes.EnmuConfigNodes: TStringList;303var304 I: Integer;305begin306 Result := TStringList.Create;307for I := 0to FXmlNodes.Count - 1do308begin309 Result.Add(FXmlNodes[i].AttributeValueByNameWide['Name']);310end;311end;312313function TConfigNodes.GetConfigNodeByIndex(AIndex: Integer): IConfigNode;314begin315 Result := TConfigNode.Create(FXmlNodes[AIndex]);316end;317318function TConfigNodes.GetConfigNodeByName(AName: string): IConfigNode;319var320 I: Integer;321begin322 Result := nil;323for I := 0to FXmlNodes.Count - 1do324begin325if FXmlNodes[i].AttributeValueByNameWide['Name'] = AName then326begin327 Result := TConfigNode.Create(FXmlNodes[i]);328 Exit;329end;330end;331end;332333function TConfigNodes.GetConfigNodeCount: Integer;334begin335 Result := FXmlNodes.Count;336end;337338{ TRootNode }339340constructor TRootNode.Create(AXmlNode: TXmlNode);341begin342inherited Create();343 FRootNode := AXmlNode;344end;345346destructor TRootNode.Destroy;347begin348 // 不能释放,等待随主类释放349 FRootNode := nil;350inherited;351end;352353function TRootNode.GetConfigsByType(AType: string): IConfigNodes;354begin355 Result := TConfigNodes.Create(FRootNode, AType);356end;357358end.因为项⽬特性,⾥⾯有注册FILEINFO的接⼝,这是我⾃⼰项⽬中的⼀个全局⽂件管理类。

Delphi解析XML文档

Delphi解析XML文档

使用Delphi解析XML 文档对于XML的解析主要有 DOM(文档对象模型)和SAX(Simple API for XML)。

DOM是通过构建内存对象来完成XML的解析,后者则是将解析过程转换为事件驱动。

Delphi提供了三种DOM解析程序:MSXML, Open XML,Xerces XML。

MSXML是微软提供的解析程序,被实现为一系列的COM对象,主要包括 msxml3.dll, msxml3a.dll, msxml3r.dll 三个动态链接库。

这里我只说一下通过IXMLDocument来完成XML的解析, 这里你只需要关心节点Node和节点集合NodeList 接口(Interface)既完成XML对象的获取,这也是我们通常会使用的方法。

首先我们来看一种通过遍历节点的方法,先来熟悉几个属性:Version :WideString 文档的版本号。

DocumentElement :IXMLNode 根节点,比如上面实例的对象。

通过根节点您就能开始遍历整个XML节点数.ChildNodes :IXMLNodeList 当前节点的子节点集合。

Node[ Nodeindex or NodeName ] :IXMLNode XML的节点。

通过节点,您可以通过它的Text ,attribute 属性来获取节点的内容和属性。

也可以使用GetNode、Get方法来获取节点。

对,没错,就是这么几个关键的属性就可以完成XML的解析工作。

通过下面的示范程序您可以了解如何通过这几个属性来从XML中获取我们想要的信息。

Var XMLDocument :IXMLDocument;XMLNode :IXMLNode;beginXMLDocument := TXML Document.Create( ‘d:\test.xml’ );XMLDocument.Active := True;XMLNode := XMLDocumen.Document.Element;Memo1.Line.Add( ‘根节点的名字为:’ + );Memo1.Line.Add( ‘根节点下的子节点数目为: ‘ +IntToStr( XMLNode.ChildNodes.Count ));XMLNode := XMLNode.ChildNodes.Node[2]; // 将当前访问的节点的第三个子节点置为要访问的节点memo.Memo1.Line.Add( ‘根节点下的第三个子节点的名字’ + );if XMLNode.HasAttribute( ‘color’ ) thenMemo1.Line.Add( ‘该节点的属性color:’ + XMLNode.Attribute[‘color’] )ElseMemo1.Line.Add( ‘该节点没有属性 color, 或者大小写不正确!’ );If XMLNode.IsTextElement thenMemo1.Line.Add( ‘该节点包含有内容Text: ‘ + XMLNode.Text )ElseMemo1.Line.Add(‘该节点为非叶子节点, 不能包含内容Text!’ );XMLNode := nil;XMLDocument.Free;XMLDocument := nil;End;节点内的属性读取还有个快捷方法。

Delphi操作XML

Delphi操作XML

Delphi操作XMLDelphi操作XMLDelphi操作XMl,只要使用 NativeXml。

我是用的版本是4.02。

NativeXML的使用方法比较简单,但是功能很强大。

XE2的话,要在simdesign.inc后面加上:// Delphi XE2 / 16{$ifdef VER230}{$define D7UP}{$define D10UP}{$define D15UP}{$endif}一、使用1) Copy the NativeXml files from the NativeXml directory into your project folder. Copy additionalfiles in the General directory to your project folder or some appropriate general folder you want.2) Include the clause "uses NativeXml" in your unit.If you want to use NativeXml in all your projects, you can also add the NativeXml folder to your library path.最简单的方法是将General 下的文件和 nativexml 下的文件复制到一个目录下,然后加入到 library路径,这样以后用到就不用拷来拷去了。

在(实现)部分 uses NativeXml; //必须的。

以下代码选自万一的博客:uses NativeXml; //!const xmlFile = 'C:\Temp ml_test_files\basic.xml'; //测试文件{原样打开}procedure TForm1.FormCreate(Sender: TObject);beginMemo1.Lines.LoadFromFile(xmlFile);end;{使用 NativeXml 打开}procedure TForm1.Button1Click(Sender: TObject); varxml: TNativeXml;beginxml := TNativeXml.Create(nil);xml.LoadFromFile(xmlFile);Memo1.Text := xml.WriteToString;xml.Free;end;{使用缩进}procedure TForm1.Button2Click(Sender: TObject);varxml: TNativeXml;beginxml := TNativeXml.Create(nil);xml.LoadFromFile(xmlFile);xml.XmlFormat := xfReadable; //格式枚举:xfCompact(压缩)、xfReadable(缩进)、xfPreserve(好像暂未处理)Memo1.Text := xml.WriteToString;xml.Free;end;{指定缩进文本}procedure TForm1.Button3Click(Sender: TObject);varxml: TNativeXml;beginxml := TNativeXml.Create(nil);xml.LoadFromFile(xmlFile);xml.IndentString := ' '; //IndentString 属性的默认值是 #9 xml.XmlFormat := xfReadable;Memo1.Text := xml.WriteToString;xml.Free;end;二、NativeXML对象的创建1、 XML:=TNativeXML.Create();//aowner可以为nil,可以是Self(这样可以随着宿主的释放而释放)2、xml := TNativeXml.CreateEx(False, //是否建立 Declaration 对象, 如:VersionString//显示XML 版本;EncodingString //显示XML 编码True, //是否建立跟节点nil //指定属主);3、{使用CreateName 建立可直接指定根节点的名称} xml:=TNativeXml.CreateName('MyRoot');4、创那个键之后可以{使用 New 方法清空并重新构建}procedure TForm1.Button4Click(Sender: TObject);varxml: TNativeXml;beginxml := TNativeXml.Create(nil);xml.LoadFromFile(xmlFile);ShowMessage(xml.WriteToString);xml.New; // XML文件清空了相当于 xml.Clear;。

Delphi中控制Word,xml,dll等操作

Delphi中控制Word,xml,dll等操作

Delphi中控制Word,xml,dll等操作DLL的建立与调用[转]动态链接库是一个能够被应用程序和其它的DLL调用的过程和函数的集合体,它里面包含的是公共代码或资源。

由于DLL代码使用了内存共享技术,在某些地方windows也给了DLL一些更高的权限,因而DLL中可以实现一些一般程序所不能实现的功能,如实现windows的HOOK、ISAPI等。

同时,DLL还为不同语言间代码共享提供了一条方便的途径。

因而DLL在编程时应用较为广泛,本文将介绍如何在Delphi 中建立和使用DLL。

一.DLL 库内存共享机制从使用效果看,DLL和unit 很像,它们都可以被别的工程模块所调用,但二者在内部的实现机制上确存在着差别。

如果一个程序模块中用uses语句引用了某个unit,编译程序在编译该模块时,便会连同unit一起编译,并把编译后的可执行代码链接到本程序模块中,这就是一个程序模块能够调用所引用unit中过程和函数的原因。

当同一个unit被多个工程所引用时,则每个工程中都含有该unit的可执行代码,当含有该unit的多个工程同时执行时,unit的可执行代码会随不同工程而多次被调入内存,造成内存资源的浪费。

DLL则不同,它即使被某个工程调用,编译后仍是独立的。

也就是说编译后,一个DLL库形成一个单独的可执行文件,而不与任何其它的可执行文件连接在一起,因而DLL库并不从属于某个特定的工程,当多个工程调用同一个DLL库时只有第一个工程把DLL库调入内存,其余工程并不重复调入同一个DLL库到内存,而是到同一个共享内存区读取。

并且,DLL的执行代码是在程序运行期间动态调入的,而不是如unit在程序运行时就与整个工程一起调入内存。

这样便可消除unit带来的相同代码多处占用内存的弊病。

二 Delphi中DLL库的建立在Delphi环境中,编写一个DLL同编写一个一般的应用程序并没有太大的区别。

事实上作为DLL主体的DLL函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。

delphixml操作

delphixml操作

Delphi中使用XML绑定来操作XML文件XML文件从前几年一出现,就非常流行,很多软件中都支持把数据保存为XML格式。

XML之所以这么受欢迎,因为它是一个非常简单的并且又是结构化的ASCII文本语言。

XML文件的这种特性,使得任何人和任何程序都能很方便的读懂它。

不过XML文件也流行了这么多年了,我却一直没有使用过它,因为:简单一些的数据,我习惯使用ini或自定义一种格式来保存;而复杂或者大量的数据,显然更适合使用数据库来保存。

直到最近写一个程序时,才不得不用到它。

下面就是我写程序时,用到的一些XML文件的编程方法我用的Delphi还是几年前的Delphi6,刚好Delphi的这个版本开始支持XML文件。

我使用的是Delphi6中的XML绑定来操作XML文件。

首先,我要操作的XML为stock.xml,它是一个关于股票方面的文件,内容如下:<?xml version="1.0" encoding="gb2312"?><StockList><StockItem Name="股票名称1" Code="股票代码1">股票例子1</StockItem></StockList>在主菜单上选择File New->Other,然后在仓库中选择XML Data Binding,会启动Delphi的XML绑定向导。

这个向导有三页,在第一页中指定stock.xml第二页显示了一些树结构和节点数据类型,这里可以修改编码(比如修改前缀)和数据类型映射第三页显示生成的类和相应接口,Delphi会将这些类和接口生成一个.pas文件,保存它,例如我保存为stock.pas绑定到这里就完成了,下面就是如何使用Delphi生成的这些类和接口了,也很简单!在主窗口的uses段中加入stock.pas,并放上一个TXMLDocument控件(在internet页)XMLDocument1,将它的FileName指定为stock.xml下面的代码取得xml第一只股票的信息:varStockList:IXMLStockListType;StockItem:IXMLStockItemType;beginStockList:=GetStockList(XMLDocument1);StockItem:=StockList.Get_StockItem(0);Memo1.Lines.Add('Name:'+);Memo1.Lines.Add('Code:'+StockItem.Code);Memo1.Lines.Add('Stock:'+StockItem.Text);end;增加一只股票的信息:varStockList:IXMLStockListType;beginStockList:=GetStockList(XMLDocument1);with StockList.Add dobeginName:='股票名称2';Code:='股票代码2';Text:='股票例子2';end;XMLDocument1.SaveToFile('stock.xml');//保存更改end;删除最后一只股票的信息:varStockList:IXMLStockListType;beginStockList:=GetStockList(XMLDocument1);StockList.Delete(StockList.Count-1);XMLDocument1.SaveToFile('stock.xml');//保存更改end;改变第一只股票的信息:varStockList:IXMLStockListType;StockItem:IXMLStockItemType;beginStockList:=GetStockList(XMLDocument1);StockItem:=StockList.Get_StockItem(0);:=+'A';StockItem.Code:=StockItem.Code+'A';StockItem.Text:=StockItem.Text+'A';XMLDocument1.SaveToFile('stock.xml');end;建立一个新的xml文件,在其中增加一只股票的信息,并保存为stock2.xmlvarStockList:IXMLStockListType;beginStockList:=GetStockList(XMLDocument1);with StockList.Add dobeginName:='股票名称1';Code:='股票代码1';Text:='股票例子1';end;XMLDocument1.Encoding:='gb2312';XMLDocument1.SaveToFile('stock2.xml');end;这就是Delphi为我们提供的XML数据绑定功能,用它来操作XML文件很方便,也很强大。

Delphi中的XMLDocument类详解(15)-创建与保存xml

Delphi中的XMLDocument类详解(15)-创建与保存xml

Delphi中的XMLDocument类详解(15)-创建与保存xml unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, xmldom, XMLIntf, StdCtrls, msxmldom, XMLDoc;typeTForm1 = class(TForm)XMLDocument1: TXMLDocument;Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}//利⽤ XML 属性创建 xml ⽂件procedure TForm1.Button1Click(Sender: TObject);beginXMLDocument1.XML.Clear;XMLDocument1.XML.Add('');XMLDocument1.XML.Add('<科室名单备注="测试">');XMLDocument1.XML.Add('<⼈员职务="科长" 备注="正局级">');XMLDocument1.XML.Add('<姓名>张三');XMLDocument1.XML.Add('<性别>男');XMLDocument1.XML.Add('<年龄>34');XMLDocument1.XML.Add('');XMLDocument1.XML.Add('');{查看}ShowMessage(XMLDocument1.XML.Text);{保存}XMLDocument1.Active := True;XMLDocument1.SaveToFile('c:\temp\1.xml');end;//创建 xml ⽂件的标准⽅法procedure TForm1.Button2Click(Sender: TObject);varpNode,cNode: IXMLNode; {定义两个节点: ⽗节点、⼦节点}beginXMLDocument1.XML.Clear;XMLDocument1.Active := True; {必须先激活}XMLDocument1.Version := '1.0'; {设置版本}XMLDocument1.Encoding := 'GB2312'; {设置语⾔}pNode := XMLDocument1.AddChild('科室名单'); {添加的第⼀个节点是根节点, 现在的 pNode 是根节点}pNode.SetAttribute('备注', '测试'); {为根节点设置属性}pNode := pNode.AddChild('⼈员'); {为根节点添加⼦节点, 现在的 pNode 是 "⼈员" 节点}pNode.SetAttribute('职务', '科长'); {设置属性}pNode.SetAttribute('备注', '正局级');cNode := pNode.AddChild('姓名'); {为 pNode 添加⼦节点, 返回值 cNode 指向了新添加的节点}cNode.Text := '张三';cNode := pNode.AddChild('性别');cNode.Text := '男';cNode := pNode.AddChild('年龄');cNode.Text := '34';{查看}ShowMessage(XMLDocument1.XML.Text); {保存}XMLDocument1.SaveToFile('c:\temp\2.xml'); end;end.。

Delphi操作xml


OpenXML――存在于oxmldom.pas单元中的SOpenXML常量;
这个是由于在msxmldom,xercesxmldom,oxmldom三个单元的initailization部分,都通过调用RegisterDOMVendor函数,注册了不同的解析器接口;
当然,Borland同样提供了一种可以灵活进行扩展的机制来扩展用户自己的解析器,这个需要继承,TDOMVendor类(存在于xmldom单元中)。实际上,Borland自己就是通过这种方式来实现不同方式解析器的;具体的实现过程可以通过参考oxmldom单元中对xdom的封装;
3、OpenXML解析器
这个解析器的源代码存在于xdom.pas单元中,这个可以通过http://www.philo.de/xml/进行跟新下载,这个是一个德国人写的XML解析器;
l 使用不同解析器的比较
对于三种方式的解析器比较如下:
1、微软的解析器
微软的解析器当然好了,但是也不能排除存在的意外情况,在我个人的经验中,至少我们公司对于XML解析的方式,只有在IE6.0以上的版本才能够正常的工作;
l 如何使用不同的解析器
我们可以写一个函数来使用不同的解析器;
function NewDiffXmlDocument(DOMVender: string;
Version: DOMString = '1.0'): IXMLDocument;
var
XMLDoc : TXMLDocument;
可以看出这些函数全部返回的是IXMLDocument接口,得到了IXMLDocument接口在进行文档的操作;
这些函数都是通过创建TXMLDocument对象来实现对XML文档的读取的;其中NewXMLDocument仅仅创建一个IXMLDocument接口。

Delphi 6 XML 文件编程

Delphi 6 XML文件编程Delphi 6 含有许多更新更强的XML支持功能。

Delphi早期版本中提到的XML只在说明MIDAS数据格式和XMLBroker组件(在ClientDataSet和ADODataSet组件中也提到过)。

Delphi 6提供的XML功能增加了XML文件编程,XML数据绑定向导,XML映象和BizSnap(SOAP/XML Web服务)。

本文是三篇论述Delphi 6中XML功能系列文章的第一篇,论述Delphi 6中的XML文件编程(XML Document Programming)。

XML文件就在前几年XML刚刚问世的时候,它就被赋予电子商务的世界语的美称,尤其在B2B(business-2-business)领域内更是如此。

原因就是XML是个非常简单的而又是结构化的ASCII文本语言,任何人和任何事都能读懂它。

与作为当前网页标准格式的HTML语言不一样。

两者之间的不同之处在于:HTML要用预先定义的语法集来解释;XML文件虽然要遵循通用的语法规则,但真正的关键词(标记)则是由作者决定的。

其含义可由DTD(Document Type Definition)文件或者现在更为流行使用的纲(Schema)来选择定义。

使用DTD或Schema的XML文件可以说是一个自我解释的文件,在数据集成化和出错调整时都很有用。

XML的结构化模式使得数据和信息可以在应用程序之间相互传递(包括在多层应用的中间层之间,例如Delphi提供的功能)。

它提供一个标准格式,对所用的通讯协议是透明的。

这就是XML在电子商务应用的电子数据交换(Electronic Data Interchange, EDI)和B2B中扮演重要角色的原因。

通过DTD或者Schema来“定义”(或检查)XML文件理所当然地使得任何人都可以与任何其它人和事交谈,只要使用恰当的的XML/DTD/Schema组合。

现在越来越经常要求集成现有的系统,XML可能成为系统之间相互交谈和理解的“语言”。

Delphi与XML示例(直接利用IXMLDocument)

begin
NNode := rootNode.ChildNodes.FindSibling(CNode,1);
CNode := NNode;
if CNode<>nil then iValue:=CNode.Attributes['proID'];
end;
end;
if CNode<>nil then rootNode.ChildNodes.Remove(CNode); //找到 ,删除
xmlDoc.SaveToFile(XMLName) ;
iReturn := 0;
except
iReturn:=-1;
end;
finally
xmlDoc := nil ;
result := iReturn;
end;
end;
end;
CNode.SetAttribute('uninstall', 'false');
NNode := CNode.ChildNodes.FindNode(nodeName);
if NNode=nil then
NNode:=CNode.AddChild(nodeName);
NNode.SetNodeValue(nodeValue) ; // ***** 写结点值 *****
var
xmlDoc:IXMLDocument;
rootNode,CNode,NNode:IXMLNode;
iValue,iReturn:integer;
sValue:string;
begin
result := -1 ;

Delphi中的XMLDocument类详解(13)-关于XML属性

Delphi中的XMLDocument类详解(13)-关于XML属性unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls;typeTForm1 = class(TForm)XMLDocument1: TXMLDocument;Memo1: TMemo;Button1: TButton;Button2: TButton;Button3: TButton;Button4: TButton;Button5: TButton;procedure FormCreate(Sender: TObject);procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);procedure Button4Click(Sender: TObject);procedure Button5Click(Sender: TObject);end;varForm1: TForm1;implementation{$R *.dfm}//打开procedure TForm1.FormCreate(Sender: TObject);beginXMLDocument1.LoadFromFile('c:\temp\test.xml');{必须⽤万⼀提供的 xml 测试⽂件, 才能有相同的返回值}end;//XMLDocument1 对象的 XML 属性procedure TForm1.Button1Click(Sender: TObject);begin{前⾯我们经常⽤这句话, 因为这⾥的 Lines 与 XML 同属于 TStrings}Memo1.Lines := XMLDocument1.XML;{如果不怕⿇烦, 这样写也可以:}Memo1.Lines.Text := XMLDocument1.XML.Text;{如果知道了这⼀点, 那 XML 属性的功能可就多了, 并且这⾥的 XML 属性是可写的}{不过这⾥要谈的是节点的 XML 属性}end;//根节点的 XML 属性procedure TForm1.Button2Click(Sender: TObject);varnode: IXMLNode;begin{先看根节点: XMLDocument1.DocumentElement}node := XMLDocument1.DocumentElement;//Memo1.Lines := node.XML; {这⼀句会出错}{因为节点的 XML 属性是 WideString 类型的, 应该这样:}Memo1.Lines.Text := node.XML; {将会读出根节点与根节点包含的所有内容}{还有⼀个更⼤的区别: 节点的 XML 是只读的!}end;//⼦节点的 XML 属性procedure TForm1.Button3Click(Sender: TObject);varnode: IXMLNode;beginnode := XMLDocument1.DocumentElement;node := node.ChildNodes[0];Memo1.Lines.Text := node.XML; {会显⽰⼀个⼦节点的全部} end;//属性的 XML 属性procedure TForm1.Button4Click(Sender: TObject);varnode: IXMLNode;beginnode := XMLDocument1.DocumentElement;node := node.AttributeNodes[0]; {属性也是 IXMLNode 类型的} ShowMessage(node.NodeName); {备注}ShowMessage(node.NodeValue); {测试}{⽤ XML 属性⼀次把他们都读出来:}ShowMessage(node.XML); {备注="测试"}end;//叶节点的 XML 属性procedure TForm1.Button5Click(Sender: TObject);varnode: IXMLNode;beginnode := XMLDocument1.DocumentElement;node := node.ChildNodes[0];node := node.ChildNodes[0];node := node.ChildNodes[0]; {这就是叶节点了}ShowMessage(node.XML); {张三}{这时的 XML 属性和 Text 属性⼀样了}ShowMessage(node.Text); {张三}end;end.。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

////////////////////////////////////////////////////////////////////////
创建IXMLDOMDocument对象的三种方法:
(1)[方法1] 直接创建 IXMLDOMDocument , 例(1)
uses msxml;
var DOC:IXMLDOMDocument;
doc := CoDOMDocument.create;
.....
Doc := nil;
A)doc.load('C:\temp.xml'); //从文件载入
B) 动态创建
var aElement,aElement2: IXMLDOMElement; // [ aNode:IXMLDOMNode
==> .AppendChild() ]
//加入版本信息‘<?xml version="1.0" ?> ’
doc.AppendChild(doc.CreateProcessingInstruction('xml', 'version="1.0"
encoding="GB2312"'));
(*)因为此函数返回结果不包含 'encoding="GB2312"' 故须保存前注意.
//加入根结点
doc.AppendChild(doc.CreateElement('bootDocNode')); //// == aElement
//加入子结点
aElement:=IXMLDOMElement(Doc.DocumentElement.AppendChild(Doc.CreateElement('Chil eNode1')));
//设置接点属性
aElement.SetAttribute('ID', '11');
aElement.SetAttribute('Units', '元/m2');
//设置结点内容
aElement.AppendChild(Doc.CreateTextNode('结点内容'));
//子结点添加子结点
aElement2:=IXMLDOMElement(aElement.AppendChild(Doc.CreateElement('Child_ChileNod e1')));
(2) [方法2] 直接创建 IXMLDocument ( 不是IXMLDOMDocument )
uses XMLIntf,XMLDoc;
var xmlDoc:IXMLDocument; aNode:IXMLNode; s:string;
xmlDoc := TXMLDocument.Create(nil);
try
//加入版本信息‘<?xml version="1.0" encoding="GB2312" ?> ’
xmlDoc.Active := True; xmlDoc.Version := '1.0'; xmlDoc.Encoding :='GB2312'; //加入根结点
aNode:=xmlDoc.AddChild('bootDocNode');
//加入子结点
aNode:=aNode.AddChild('ChileNode1');
//设置接点属性
aNode.SetAttribute('ID', '22');
aNode.SetAttribute('Units', '元/m2');
//设置结点内容
aNode.Text := '结点内容';
//子结点添加子结点
aNode:=aNode.AddChild('Child_ChileNode1') ;
aNode.Text := 'Child_ChileNod内容';
s := xmlDoc.XML.Text ; // .XML 返回的是 Tstrings
finally
xmlDoc := nil ;
end;
(3)利用 XMLDataBinding
I) 准备好XML文件,此XML文件有较强的代表性,保证程序中所用的结点及其关系都存在 II)利用 file-->new-->XML Data Binding
III)创建XML对象
A)v:string; //XML文件内容
Doc : IXMLBudgetDocTyp; //IXMLBudgetDocTyp是XML文件的根结点
Doc := LoadXMLData(v).GetDocBinding('BudgetDoc', TXMLBudgetDocType) as IXMLBudgetDocType;
B)Doc := LoadBudgetDoc('C:\temp.xml');
IV) 应用
Doc.ChildNodes.FindNode('Docfile') as IXMLDocfileType;
(4)利用TXMLDocument控件
XMLDocument1.fileName:='C:\temp.xml';
XMLDocument1.active:=true; // XMLDocument1 相当于 Doc
(5)XML对象的其他方法
IXMLNodeList.FindNode(NodeName: DOMString): IXMLNode;
IXMLNodeList.FindNode(NodeName, NamespaceURI: DOMString): IXMLNode;
IXMLNodeList.FindNode(ChildNodeType: TGuid): IXMLNode;
IXMLNodeList.FindSibling(const Node: IXMLNode; Delta: Integer): IXMLNode;
IXMLNodeList.First: IXMLNode;
st: IXMLNode;
... ...
////////////////////////////////////////////////////////////////////////
//例(1)
uses msxml;
doc:IXMLDOMDocument;
budgetdoc:ixmlDomNode;
Rela:IxmlDOMNode;
rs:ixmldomnodelist;
//建立或取得XML结点
doc := CoDOMDocument.create;
doc.load('C:\temp.xml');
budgetDoc := doc.selectSingleNode('BudgetDoc');
rela := budgetdoc.SelectSingleNode('Relation');
//创建XML子结点
if not assigned(rela) then
begin
rela := doc.createElement('Relation');
rela.setAttribute('BudgetId',0);
rela.setAttribute('name','名称');
budgetdoc.appendChild(rela);
end;
//取子结点(序列)
rs := rela.selectNodes('Rela[@BudgetId="2" and @TaskId="8"]');
for i := 0 to rs.length -1 do
begin
s:= s + rs[i].attributes.getnameditem('NewRate').nodeValue;
end;
rela:=doc.ChildNodes.FindNode('DOMNode') as IxmlDOMNode;
//移除子结点
for i := rs.length -1 downto 1 do
rela.removeChild(rs[i])
//取父结点
if assigned(anode.parentNode) and (Anode.parentNode.nodeName='Task') then result := Anode.parentNode;
//取属性
DOC.DocumentElement.Attributes['Name']
rela.Attributes['Name']
rs.Nodes[i].Attributes['Name']
Ajob:ixmldomnode;jobs:ixmldomNodeList;
jobs := Ajob.selectNodes('RCJ[@Attrib="'+AAttrib+'"]')。

相关文档
最新文档