基于Delphi的XML文件管理系统的设计

合集下载

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;节点内的属性读取还有个快捷方法。

delphi7解析XML文件

delphi7解析XML文件

关于如何生成XML 文档, 有两种主要方法:
1.通过IXMLNode 对象的AddNode 或者 SetValue来动态的生成。
2.手工,以字符串的形式生成
memo1.Lines.Add(xml.Data.Row[1].name); // 比如我要取得data下的第2个row 中的name属性。
Memo1.Lines.Add( xml.Memo.Color ); // 访问Memo节点中的属性 color
Memo1.Lines.Add( xml.Memo.Text ); // 访问 Memo 节点中的属性 Text。
XMLDocument.Active := True;
XMLNode := XMLDocumen.Document.Element;
Memo1.Line.Add( ‘根节点的名字为:’ + );
Memo1.Line.Add( ‘根节点下的子节点数目为: ‘ + IntToStr( XMLNode.ChildNodes.Count ));
// 获取指定的节点
XMLNode := GetNode( strNodePath, intRowIndex, dep );
Result := True;
// End 。
if not assigned( XMLNode ) then
begin
Result := False; // 无效的节点或者该节点不能包括单独的Text
5. 将Delphi生成的这个接口单元use到您要调用该XML文档的单元中, 以根节点的接口做为入口,你就可以轻松的访问与该XML类似结构的XML文档了。
一下是个小的示范。

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函数的编写,除了在内存、资源的管理上有所不同外,并不需要其它特别的手段。

Delphi 6 XML 文件编程

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)

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的项目数据库管理系统的实现

基于Delphi的项目数据库管理系统的实现
利润空间 。
2 . 2 d e1 D hi
科 研人 员在进 行 查找 资料 以及 统 计 信 息 时能快 速 地 完成 工作 。为 了达 到这 样 的结 果 ,一般 会采 用 D e l p h i 数 据 库 管理 系统 ,通过 该 系统 所提 供 的数据 处 理 能力来 对 海 量 的数 据进 行 处理 。在 此基础 上 ,建立起 一套集成 了项 目管理、 资料 的 自 行 处 理 以及数 据 统计 等 常 用功能在 内的信 息处理 系统 图, 在短 时间 内能 够 实现信 息 的 高质 量 与 高效 处理 。在这 样 一套 系统
己的 双手 ,让计 算机 来 完成 复 杂 的数 据 处 理工 作,进 而提 升 科研 工作 的质量 与效率 。
供一套可视化程度较高 的开发 系统,进 而降低 而用户在加入 了扩展语句之后 ,能够提 升编程
了科研项 目的难度 ,一经推 出就 受到了大量 开 程 序的宽度 ,让它实现不 同的功 能,直接 降低
发者 的 青 睐 。
了很多工作的复杂性 ,进而使原本枯燥 的编程
Hale Waihona Puke 在 传 统 的 编 程 领 域 ,基 于 VB语 言 的可 视 变 成了一个有趣 并且轻松的工作。
: 键 词 】项 目数 据库 D e l p h i 计 算机 软件
系统
化编程 技 术一 直是 行业 的主 流,而 De l D h i 的
能实现 更 多的功 能 ,企业在 使 用 D e h i 的 时
为 了给 大量 的科 研 工作提 供较 好 的数据

各个研 究机 构一般都会建立起较丰 富的
候甚至不需要更换 自己的硬件设 备。 最重要 的, De l p h i 还是一种真 正基于对象 的编程语 言,由 于可视 化程 度较高,对广大数据库 的兼容性较

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

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;。

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类详解(13)-关于XML属性

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.。

DelphiXml

DelphiXml

DelphiXml⽤递归⽅法,使⽤ xml ⽂档⽣成 Treeview 树形视图。

由于是动态⽣成,所以可以通过修改 xml 的逻辑来定制 Treeview 的结构,从⽽实现了 xml 对 Treeview 的动态配置,⽽不⽤修改代码。

xml ⽂件如下:<?xml version="1.0" encoding="gb2312"?><root topic="频道列表" catalog="none"><channel topic="操作系统" catalog="none"><channel topic="Windows频道" catalog="windows" /><channel topic="DOS频道" catalog="dos" /><channel topic="Linux" catalog="linux" /></channel><channel topic="菜鸟专区" catalog="cainiaozhuanqu" /><channel topic="应⽤软件" catalog="app" /><channel topic="安全专区" catalog="safe" /><channel topic="代码实验室" catalog="lab" /><BBS topic="电脑学习社区" catalog="none"><subBBS topic="⼦社区-1" catalog="sub1" /><subBBS topic="⼦社区-2" catalog="sub2" /></BBS></root>View Code程序代码如下:unit tree_xml;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls,Forms, Dialogs, ComCtrls, StdCtrls, XMLDoc, XMLIntf;typeTForm1 = class(TForm)TreeView1: TTreeView;Memo1: TMemo;Button1: TButton;procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure Button1Click(Sender: TObject);privatefunction CreateTreeview(XmlNode: IXMLNode; TreeNode: TTreeNode):TTreeNode;{ Private declarations }public{ Public declarations }end;typepRec = ^TData;TData = recordsCatalog: string;sReserved: Stringend;varForm1: TForm1;implementation{$R *.dfm}function TForm1.CreateTreeview(XmlNode: IXMLNode; TreeNode: TTreeNode): TTreeNode;vari: integer;ParentTreeNode, CurrentTreeNode: TTreeNode;pData: pRec;beginNew(pData);pData^.sCatalog := XmlNode.AttributeNodes['catalog'].NodeValue;CurrentTreeNode := TreeView1.Items.AddChildObject(TreeNode,XmlNode.AttributeNodes['topic'].NodeValue, pData); //pointer(...)if XmlNode.HasChildNodes thenbeginParentTreeNode := CurrentTreeNode;for i:=0to XmlNode.ChildNodes.Count-1dobeginCreateTreeview(XmlNode.ChildNodes[i], ParentTreeNode);end;end;result := CurrentTreeNode;end;{------------------------------------------------------------------}procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);var pData: pRec;beginpData := Treeview1.Selected.Data;Memo1.Lines.Add(pData^.sCatalog);end;procedure TForm1.Button1Click(Sender: TObject);varoXml: TXMLDocument;beginoXml := TXMLDocument.Create(self);oXml.FileName := '_Treeview.xml';oXml.Active:=true;CreateTreeview(oXml.ChildNodes.FindNode('root'), Treeview1.Items.GetFirstNode);Treeview1.FullExpand; //节点全部展开oXml.Free;end;end.View Code注意程序中 Treeview 的 TreeView1.Items.AddChildObject ⽅法,其最后⼀个参数⽤来保存该节点的相关数据,是⼀个指针类型的数据,使⽤时要格外⼩⼼。

在delphi中使用xml文档

在delphi中使用xml文档

在delphi中使用xml文档.txt心态决定状态,心胸决定格局,眼界决定境界。

当你的眼泪忍不住要流出来的时候,睁大眼睛,千万别眨眼,你会看到世界由清晰到模糊的全过程。

在delphi中使用xml文档[ 2006-3-16 10:33:00 | By: chys ]在delphi中使用xml文档有两种方法使用xml broker, 是delphi 内置的。

例:unit ShowXML;interfaceuses Classes HTTPApp Db DbClient MidasXMLBrokr WebComp MidItems;typeTCustomShowXMLButton = class(TXMLButton IScriptComponent)protectedXMLMethodName: string;{ IScriptComponent }procedure AddElements(AddIntf: IAddScriptElements);function GetSubComponents: TObject;{ IWebContent implementation }function ImplContent(Options: TWebContentOptions;ParentLayout: TLayout): string; override;end;TShowXMLButton = class(TCustomShowXMLButton)publicconstructor Create(AOwner: TComponent); override;publishedproperty Custom;property Style;property StyleRule;property Caption;property XMLBroker;property XMLUseParent;end;TShowDeltaButton = class(TCustomShowXMLButton)publicconstructor Create(AOwner: TComponent); override;publishedproperty Custom;property Style;property StyleRule;property Caption;property XMLBroker;property XMLUseParent;end;implementationuses sysutils MidProd;resourcest***sShowXML = 'Show XML';sShowDelta = 'Show Delta';procedure TCustomShowXMLButton.AddElements(AddIntf: IAddScriptElements);beginAddIntf.AddIncludeFile('xmlshow.js');end;function TCustomShowXMLButton.GetSubComponents: TObject;beginResult := nil;end;function TCustomShowXMLButton.ImplContent(Options: TWebContentOptions;ParentLayout: TLayout): string;varAttrs: string;Intf: ILayoutWebContent;FormVarName: string;RowSetVarName: string;beginAddQuotedAttrib(Attrs 'NAME' Name);AddQuotedAttrib(Attrs 'STYLE' Style);AddQuotedAttrib(Attrs 'CLASS' StyleRule);AddQuotedAttrib(Attrs 'VALUE' Self.Caption);AddCustomAttrib(Attrs Custom);if Assigned(XMLData.XMLBroker) thenbeginFormVarName := XMLData.XMLBroker.SubmitFormVarName;RowSetVarName := XMLData.XMLBroker.RowSetVarName(nil); // Row row set var name end;if not (coNoScript in Options.Flags) thenResult :=Format(''#13#10[Attrs RowSetVarName XMLMethodName sXMLRea***Var])elseResult :=Format(''#13#10[Attrs]);if Assigned(ParentLayout) and ParentLayout.GetInterface(ILayoutWebContent Intf) thenResult := youtButton(Result GetLayoutAttributes);end;{ TShowXMLButton }constructor TShowXMLButton.Create(AOwner: TComponent); begininherited;DefaultCaption := sShowXML;XMLMethodName := 'root';end;{ TShowDeltaButton }constructor TShowDeltaButton.Create(AOwner: TComponent); begininherited;DefaultCaption := sShowDelta;XMLMethodName := 'getDelta()';end;另一种方法使用msxml.dll 如下:........procedure TDHEDForm.OpenBtnClick(Sender: TObject);varpVIn : OleVariant;Prompt : OleVariant;beginpVIn := '';Prompt := True;DHtmlEdit1.LoadDocument(pVIn Prompt);end;procedure TDHEDForm.SaveBtnClick(Sender: TObject);varvo vb : OleVariant;beginvo := DHTMLEdit1.CurrentDocumentPath;if (vo <> '') thenbeginvb := false;endelsebeginvo := '';vb := true;end;DHTMLEdit1.SaveDocument(vo vb);end;procedure TDHEDForm.SaveAsClick(Sender: TObject);varvo vb : OleVariant;beginvo := '';vb := true;DHTMLEdit1.SaveDocument(vo vb);end;2005-12-29 13:41:48查看评语&raquo;&raquo;&raquo;2005-12-29 13:44:23 Delphi 对XML的支持---TXMLDocument类Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写。

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的接⼝,这是我⾃⼰项⽬中的⼀个全局⽂件管理类。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
th o r e Ca t n = l o e . l Na ; s s u e . p i : d g p nFi o e me p g c n r 1 t e a e n e : O; a e o t . i P g I d x= o Ac v
关键词
xl xl m m 编辑
d lh epi w lo : w lo F r C et(i; 新 建 , eF r T e me om.raenl/ m: c )/ 调用 新建 文档 向导 对话 框
TrDt.tmsBei Up ae v dIe . gn d t;
T v d. e . e r r Dt I msCla ; t XI I  ̄ IP L rNo ai e: . r lz =TRUE; m
Xml a s r t r e n P re. at a ; S S W HI正 Xm】 l rS a I Pa  ̄e .c n DO
ipiti o 1 x ctte/打印 f r da g . eue hn/ n l E Mmoore f t r tio 1 m ) S uc.i ( i da g. e P n p n l Na
Mm Suc.e e U /全 选 o oreSl t ;/ eA
Mmoot eCereetn /删 除 Ste.laSlei ;/ r o
m s el . 于新 建的文件 ,请先保存 再使用视 图功能 ! es d 对 g a g( ,
叙 毛 i 27 f 7 .
I 理工科 研
ml f r f n, i o ma o n i END;
【 y ,) mb ̄] ; 0
D lt i (in m ) e e l Fl a e; eFe e
wef r S o l m. h w; o
Hale Waihona Puke coe/退 出 l ; s
T Flfa )/保存 oi ( me en ;
Mm Ste.uT Cibad /剪 切 o oreC to l or ; t p
Mm Suc.o y o l b ad /复制 o oreC pT Ci or;/ p
Mmoo re atFo l bad/粘 贴 Suc . s rmCi or; P e p / Mmoo re d;/ 销 Suc. o/撤 Un
i fmman Mmo o r eT x<> h n fr i. S u c . e t “t e
如果要看 D D结 构视图 , T 直接切换到 D D结构视图面板或者 T
点击菜单栏下 的“ T D D视图” 按钮 即可。 当用户切换到 D D视图时 ,系统就会 自动提取 x 文档 内部 T ml 的 D D 对其结构进行分析 。关键代码如下 : T,
b n/ 萌 /弹出对话框提示
是否保存 当前 文件 ’ t f m f n , i o ao , m nr i
【b e, n] m ys mb o ; )
理 工 科 研
基 于 D lh 的 X ep i ML文件管理 系统 的设计
詹 百灵
( 漳州市第二技 工学校
中图分类号 : 7 9 F 1 文献标识码 : A
福建 ・ 漳州 330 ) 60 0
文章编号 :6 2 7 9 ( 0 9)9 2 _— 2 17 — 8 42 0 1 — 7 0 7
34 D D 结构 视 图模 块 设 计 . T
用户可以在文本视图中使用工具栏上的按钮对文 档进行 编辑 , 也可 以使用菜单栏 下的按钮进行相应 的操作 。如果 原先文本视 图 里有 内容 , 时再 按“ 这 新建 ” 按钮 , 系统 就会弹 出一个 是否保存文件 对话框 , 让用户选择是否保存当前文件 。如果用户选择“ e” Y s按钮 , 则会调用保存文件对话框。选择“ o 按钮 。 N” 系统直接显示创建文档 对话框 。点击“ 打开” 按钮后 , 进入 打开文件对话框 , 用户可 以选择 要打 开的文件 , 打开” 按“ 按钮生效 。首次点击“ 保存 ” 按钮 , 会调用 保存文件对话框 。非首次点击“ 保存” 按钮 , 则系统会 自动将新更改 的内容保存到原文件 中。相应代码如下 :
’ ● ● ●● - ’
点击“ 新建” 按钮后 , 进入新建界 面 , 该界 面用于用户 自 导人 行 各类 文档 的模板 。
用户 可以根据需要选 择一种 文档类型 , 确定” 按“ 按钮后就可以 打开相应 的模板文件 。 同时系统 还会提 供一些 帮助信息。 这时系统 会跳 出一个 信息框提示 ,建议 用户先保存 文件再使用 其他视 图功 能。主要代码如下 :

,切换视 图窗 口 /
P gC nr1 t e ae: ae ot 1 ae [ d x; ae ot . i P g =P gC nr . gsi e] oAev oP n
i dao .xc t; f d il 1E eue/查找对话框 n g /

MmooreCer d;/ 做 S uc.laUn o『重
摘 要 本 文介 绍 了利用 D lh 开发 一种适合初 学者使用 的 ep i xl m 编辑 工具 , 让初 学者 能够很 直观地 看到 X L的结构 , 而 学> M 进 - - j
X L语 法 。 M
R a Fl (lO e .i nme; ed i Dg p nFl a ) e e
, / 根据需要加载相应文档 的模板
La Fo i ( xmpex _ ou n od rmFl . a lL dc met e e ml
XML) ’ ;
FmManp eot 1 t e aen e:0/新建 文档时 自动 显示 r i.a enr . i P gldx ; g oAev = / 文本视 图面板 c s;/ l e/关闭创建文档对话框 o , / 弹出对话框提示用户保存文件 谩Dg p nE eue HE 扪歼 l e .xc tT Nf O }
相关文档
最新文档