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 文档对于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操作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等操作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操作
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 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)
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.。
Delphi中用Xml配置文档生成Treeview
Delphi中⽤Xml配置⽂档⽣成Treeview⽤递归⽅法,使⽤ 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>程序代码如下: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:=0 to XmlNode.ChildNodes.Count-1 dobeginCreateTreeview(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.注意程序中 Treeview 的 TreeView1.Items.AddChildObject ⽅法,其最后⼀个参数⽤来保存该节点的相关数据,是⼀个指针类型的数据,使⽤时要格外⼩⼼。
Delphi之通过代码示例学习XML解析、StringReplace的用法
Delphi之通过代码⽰例学习XML解析、StringReplace的⽤法 这个程序可以⽤于解析任何合法的XML字符串。
⾸先是看⼀下程序的运⾏效果: 以解析这样⼀个XML的字符串为例:<?xml version="1.0" encoding="UTF-8"?><BookInfo><Owner><OwnerName>张三</OwnerName><OwnerAge>1234</OwnerAge></Owner><BookMes><BookName>时间简史</BookName><ISDN>234343453534</ISDN><Writer>霍⾦</Writer></BookMes></BookInfo> ⾸先是打开应⽤程序 然后将上⾯所⽰的字符串复制到⽂本编辑框中,然后点击解析按钮,会出现下⾯的效果 如上图所⽰,可以 “XML中的字段标签:XML中对应标签的值” 的格式显⽰解析的效果。
因为进⾏了异常处理(使⽤try..except..end,并且在异常处理中使⽤ShowMessage弹出异常信息),所以如果输⼊的字符串不是合法的XML格式的话,程序会正常报错,⽽不会异常终⽌。
⽐如没有输⼊直接点击解析按钮,效果如下: 有⽐如输⼊⼀个⾮法的字符串,效果如下然后看⼀下代码 unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, XMLIntf, XMLDoc;typeTForm1 = class(TForm)edt1: TEdit;btn1: TButton;procedure btn1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}procedure ReadXml(Node: IXMLNode; var showmess: string);varNodeList: IXMLNodeList;strName: string;i: Integer;beginif not Node.HasChildNodes then Exit;nodeList := node.ChildNodes;for i := 0 to nodeList.Count - 1 dobeginstrName := nodeList[i].NodeName;if nodeList[i].IsTextElement then //如果是元素beginshowmess:= showmess + strName + ':' + NodeList[i].NodeValue + #13#10;endelse if nodeList[i].HasChildNodes then //如果有⼦节点beginReadXml(NodeList[i], showmess);end;end;end;procedure TForm1.btn1Click(Sender: TObject);varsXML, showmess: string;ComInstrXML: IXMLDocument;mainNode: IXMLNode;beginshowmess:= '';sXML:= edt1.Text;sXML:= StringReplace(sXML, 'UTF-8', 'gbk', []); //只替换<?xml version="1.0" encoding="UTF-8"?>⾥⾯的字符编码⽅式,因为往往这个是在最前⾯出现的,所以StringReplace的第四个参数是[] try //⼀定不要忘记异常处理,保证程序的稳定性,能够正常处理异常⽽不⾄于在发⽣异常的时候导致程序崩溃ComInstrXML:= LoadXMLData(sXML);mainNode:= ComInstrXML.DocumentElement;readXML(mainNode, showmess);ShowMessage(showmess);excepton E: Exception dobeginShowMessage(E.Message);end;end;end;end.讲解⼀下代码 0.建议这样使⽤XML解包 本例中的程序,在解包之后是将标签以及对应的值显⽰在弹出框上,这样只是为了演⽰解析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查看评语»»»2005-12-29 13:44:23 Delphi 对XML的支持---TXMLDocument类Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写。
Delphi直接读取XmL
Delphi直接读取XmL有时,只需要⽤XML作⼀些⼩的应⽤,⽐如只是简单地保存⽇志或者⼀些配置,这时我们只需要直接读写XML就好,效率第⼀。
Delphi盒⼦有⼀个直接读写XML⽂件 (例⼦和代码),其核⼼函数为下⾯两个函数(⼀读⼀写):{-------------------------------------------------------------------------------Fun/Pro: GetXMLNodeValue@Date: 2004.12.11@Param: xmlFile xml⽂件@Param: xmlnodepath 节点@Param: xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
@Param: dep 节点的参数的分隔符,默认为.@Return: 第⼀个节点的值-------------------------------------------------------------------------------}function GetXMLNodeValue(strEntityEngineFile:String; xmlNodePath:String;const xmlattrname:String=''; const dep:Char ='.'):String;varxmlDocument :IXMLDocument;node :IXMLNode;xmlnodeList :TStrings;i :Integer;urlcount :Integer;begin//xml节点路径xmlnodeList:=TStringList.Create;xmlnodeList.Delimiter:=dep;xmlnodeList.DelimitedText:=xmlnodepath;urlcount:=xmlnodeList.Count;//xml对象xmlDocument :=TXMLDocument.Create(nil);xmlDocument.LoadFromFile(strEntityEngineFile);xmlDocument.Active:=true;trynode:= xmlDocument.DocumentElement;if(node.NodeName = xmlnodeList[0]) then begin//扫描节点for i := 1to urlcount-1do beginif(node<>nil) thennode := getnodefromIXMLNodeList(node.ChildNodes,xmlnodeList[i])else Break;end;if(node=nil)then beginresult:='';end else begin//判断是取属性还是取节点内容if(Trim(xmlattrname)='') thenresult:=node.Textelseresult:=node.AttributeNodes.Nodes[xmlattrname].NodeValue;end;end else beginresult:='';end;exceptresult:='error';end;xmlDocument.Active:=false;end;{-------------------------------------------------------------------------------Fun/Pro: SetXMLNodeValue@Date: 2004.12.11@Param: xmlFile xml⽂件@Param: xmlnodepath 节点@Param: xmlattrname 节点中的属性名称,如果直接取节点值则可以忽略此参数。
delphi中的XML解析控件TXMLDocument的用法
delphi中的XML解析控件TXMLDocument的用法delphi中的XML解析控件TXMLDocument的用法CND8学院Delphi教程发布日期:2008年07月09日收藏至我的CND8Delphi中TXMLDocument控件的用法Delphi中对XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,现称述于下面。
在讲之前先给出一个XML实例,在讲某些部分是要结合实例比较容易理解。
1<?xml version="1.0" encoding="gb2312"?> <!--文档版本信息, 注释格式同HTML-->2<XMLPackage>3 <clinetinfo ip=”202.101.100.90” handler=”si” unit=”江苏网商软件”/>4 <data>5 <row id=”1” name="太阳" sex=”男” age="24" duty="软件工程师"/>6 <row id=”2” name="月亮" sex=”女” age="25" duty="部门经理"/>7<!--data中包含了元素row的两个实例,通过属性id予以区分-->8 </data>9 <memo length=”16” color=” $0034494B”>Hello! I am yaya! </memo> <!-- 这个元素中间包含的内容成为T ext,而且也含有两个属性 length, color,当然也可以没有属性 -- >10 <Actions acition=”update/insert”/> <!—该元素描述了一动作控制信息-->11</XMLPackage>TXMLDocument控件提供了我们两种常用做法:一、直接用这个类封装的属性和方法来读写XML文件,我把它称为自己解析法;二、用控件提供的XML Data Binding Wizard来创建一个适合用户自己的接口单元,然后按照这个接口单元提供的许多接口来实现对同类XML 文件的读写,十分方便,但有局限性,我把它称为控件解析法。
客户端delphi使用XML与中间层C#.net通信的例子,客户端用idhttp的post发送请求
客户端delphi使用XML与中间层C#.net通信的例子,客户端用idhttp的post发送请求1.客户端代码:1.unit Unit1;2.3.interface4.es6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,7. Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,8. IdHTTP, StdCtrls;9.10.type11. TForm1 = class(TForm)12. IdHTTP1: TIdHTTP;13. Button1: TButton;14. Button2: TButton;15. Memo1: TMemo;16. procedure Button2Click(Sender: TObject);17. private18. { Private declarations }19. public20. { Public declarations }21. end;22.23.var24. Form1: TForm1;25.26.implementation27.28.{$R *.dfm}29.30.procedure TForm1.Button2Click(Sender: TObject);31.var32. respsm:TStringStream;33. AList:TStrings;34. uri:string;35.begin36. uri:='http://localhost:4983/WebSite3/Default.aspx';//这个地址换成自己的响应地址37. AList:=TStringList.Create;38. {中文乱码问题解决方法:发送过去之前先转码UTF8Encode,接收的时候再解码UTF8Decode}39. AList.Add(UTF8Encode(Memo1.Text));40.41. respsm:=TStringStream.Create('');42. //IdHTTP1.Get('http://localhost:4983/WebSite3/Default.aspx?id=3',sm);43. IdHTTP1.Request.ContentType:='application/x-www-form-urlencoded';44. try45. IdHTTP1.Post(uri,AList,respsm);46. finally47. ShowMessage(UTF8Decode(respsm.DataString));//respsm.DataString为中间层返回的数据48. end;49.50. respsm.Free;51. AList.Free;52.53.end;54.55.end.客户端memo1.Text的内容为(在设计界面直接编辑memo1.lines,输入以下内容):1.<?xml version="1.0" encoding="utf-8" ?>2.<erp>3.<head>4.</head>5.<body>6.<client job="RoleInfo_New">7.<main job="New" ID="" Name="测试角色3" />8.</client>9.</body>10.</erp>中间层代码:(Default.aspx.cs)ing System;ing System.Data;ing System.Configuration;ing System.Web;ing System.Web.Security;ing System.Web.UI;ing System.Web.UI.WebControls;ing System.Web.UI.WebControls.WebParts;ing System.Web.UI.HtmlControls;10.//添加以下命名空间ing System.Xml;ing System.Data.Sql;ing System.Data.SqlClient;ing System.IO;ing System.Text;16.17.public partial class _Default : System.Web.UI.Page18.{19.protected void Page_Load(object sender, EventArgs e)20. {21.22. Stream sm = Request.InputStream;23. sm.Position = 0;24.byte[] buff = new byte[sm.Length];25.//char[] buff = new char[sm.Length];26.int len = (int)sm.Length;27. sm.Read(buff, 0, len);28.//StreamReader sr = new StreamReader(sm);29.//sr.Read(buff, 0, len);30.string str = Encoding.UTF8.GetString(buff);31.32. str = Server.UrlDecode(str);33.34.string ID = null;35.string[] AttrList = new string[2];36.37. XmlDocument dom = new XmlDocument();38. dom.LoadXml(str);39. XmlNodeList xnl = dom.GetElementsByTagName("client");40.if (xnl[0].Attributes[0].Value.ToString().StartsWith("RoleInfo_"))41. {42.if (xnl[0].Attributes[0].Value.ToString().EndsWith("New"))43. {44.for (int i = 0; i < AttrList.Length; i++)45. {46. AttrList[i] = xnl[0].ChildNodes[0].Attributes[i + 1].Value;47. }48. SqlConnection conn = new SqlConnection("server=.;database=test;uid=xj;pwd=123456");49. conn.Open();50. SqlCommand comm = new SqlCommand();51. comm.Connection = conn;52. mandText = "insert into RoleInfo(Name) values(@Name);select @@identity as id;";53. comm.Prepare();54.55. comm.Parameters.Add("@Name", SqlDbType.VarChar, 50);56. comm.Parameters[0].Direction = ParameterDirection.Input;57. comm.Parameters[0].Value = AttrList[1];58.//取刚插入数据库的记录的ID59. DataSet ds = new DataSet();60. SqlDataAdapter sda = new SqlDataAdapter(comm);61. sda.Fill(ds);62.63. comm.Dispose();64. conn.Close();65. conn.Dispose();66.67. ID = ds.Tables[0].Rows[0][0].ToString();68. //插入成功将ID返回给客户端69. Response.Clear();70. Response.ContentType = "text/xml";71. Response.Write("<?xml version=/"1.0/" encoding=/"utf-8/" ?>");72. Response.Write("<erp>");73. Response.Write("<head />");74. Response.Write("<body>");75. Response.Write("<server>");76. Response.Write("<main job=/"New/" ID=/"" + ID.ToString() + "/" />");77. Response.Write("</server>");78. Response.Write("</body>");79. Response.Write("</erp>");80.81. }82. }83. }84.}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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+'"]')。