【我爱DELPHI,我学XML】DAY 1:简单节点增删改查

王朝delphi·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

DAY-1

XML文档简单读写方法

CST 2005-07-08

最近参加一个项目需要写XML,因此我开始学习XML在delphi中的编程方法,我将我STEP BY STEP的入门过程记录下来,希望经验丰富的前辈能给我指点,也希望给像我一样有意尝试XML编程的朋友投石问路一下。

本文中使用的一个实例记录一个学生信息的XML文档,具体代码可以访问我的YAHOO公文包

http://cn.f1.pg.briefcase.yahoo.com/iamcst

\BLOG附件\XML_DAY_01_BASIC_NODE

也可以电邮我。

基本介绍

本文档描述采用TXMLDocument类读写XML文档。

在控件选项卡的InternetàXMLDOC

节点的类为IXMLNode

基本编程过程

过程

代码

读入XML文件并激活文档

xmldoc1.LoadFromFile('test.xml');

xmldoc1.Active := true;

创建节点实体

var

nd:IXMLNode;

定位节点

SearchNode:=xmldoc1.Node;

//定位到根

SearchNode:=SearchNode.ChildNodes.Nodes[1];

//第2层

SearchNode:=SearchNode.ChildNodes.Nodes[0];

//第1个节点

添加子节点

StNode为已定位的父节点,插入子实体节点后,指向子实体。//记录

Attribute为节点内参数

AttrNode为子实体节点的属性节点 //字段

StNode:=StNode.AddChild('STUDENT'); StNode.Attributes['SID']:=’xxxx’;

AttrNode:=StNode.AddChild('NAME');

AttrNode.NodeValue :=sName;

删除子节点

TargetNode.ParentNode.ChildNodes.Delete

(TargetNode.ParentNode.ChildNodes.

IndexOf(TargetNode));

获得实体节点的属性子节点的值

TargetNode.ChildValues[‘NODENAME’]

定位子节点

遍历根节点,找到实体节点层

根据实体的ATTRIBUTE定位

sNode:=mNode.AttributeNodes.FindNode('ID');

保存文件

xmldoc1.SaveToFile('test.xml');

创建文档

采用手动创建一个文本方式的XML源代码文件,可以在DELPHI里用基本文件输出或者复制模板到目标地址,文件内容包括如下代码:

<?xml version="1.0" encoding="UTF-8"?>

<main>

</main>

写入根级选项

使用两个STRINGLIST实体,一个记录选项节点名称,一个记录选项值。

使用如下函数,将STRINGLIST写入根节点。

procedure TFormXMLTester.AddOption(const ANodeList,AValueList:TStringList);

var

i:integer;

rootNode:IXMLNode;

begin

rootNode:=xmldoc1.Node;

rootNode:=rootNode.ChildNodes.Nodes[1]; //root-->human

for i:=0 to ANodeList.Count-1 do

begin

rootNode.AddChild(ANodeList.Strings[i]).NodeValue:=AValueList.Strings[i];

end;

end;

写入实体节点

StNode定位到要插入实体位置的父节点,AttrNode为实体节点的属性节点。

使用IXMLNODE的ADDCHILD方法创建一个命名的节点,返回值为新建的节点。

对NODEVALUE属性赋值,使用AttrNode对象。

procedure TFormXMLTester.addStudent(const sID,sName,sSchool,sLevel:string);

var

StNode,AttrNode:IXMLNode;

begin

StNode:=xmldoc1.Node;

StNode:=StNode.ChildNodes.Nodes[1]; //human

StNode:=StNode.ChildNodes.Nodes[0]; //human.person

StNode:=StNode.AddChild('STUDENT'); // human.person.student

StNode.Attributes['SID']:=sID;

AttrNode:=StNode.AddChild('NAME');

AttrNode.NodeValue :=sName;

AttrNode:=StNode.AddChild('SCHOOL'); // human.person.student.school

AttrNode.NodeValue := sSchool;

AttrNode:=StNode.AddChild('LEVEL'); // human.person.student.level

AttrNode.NodeValue:=sLevel;

end;

定位到节点

实体节点的节点名称可能是相同的,通过节点内参数Attribute区分各节点,类似DB中的PK。

定位采用3个节点

n SEARCHNODE 根定位节点,定位到要搜索的层

n MATCHNODE 用来遍历的节点,遍历的是实体节点,找到后返回的就是这个节点

n SNODE 实体节点的ATTRIBUTE,用来和KEYWORD比较

//通过学号ATTRIBUTE定位STUDENT节点

function TFormXMLTester.GetNodeBySID (const AID:String):IXMLNode;

var

//定位 遍历 比较

SearchNode,matchNode,sNode:IXMLNode;

sID:string;

i:integer;

begin

result:=nil;

sID:=AID;

SearchNode:=xmldoc1.Node;

SearchNode:=SearchNode.ChildNodes.Nodes[1];

SearchNode:=SearchNode.ChildNodes.Nodes[0]; //human.person

matchNode:=SearchNode.ChildNodes.First; //human.person.student(0)

for i:=0 to SearchNode.ChildNodes.Count -1 do

begin

matchNode:=SearchNode.ChildNodes.Nodes[i];

if matchNode.HasAttribute('SID') then

begin

sNode:=matchNode.AttributeNodes.FindNode('SID');

if (snode.NodeValue = sID) then

begin

result:=matchNode;

exit;

end; //matchNode=>human.person.student(id=sid)

end;

end;

end;

删除节点

删除的方法很有趣,代码如下:

TargetNode.ParentNode.ChildNodes.Delete(TargetNode.ParentNode.ChildNodes.IndexOf(TargetNode));

修改节点

建议简化为定位――删除――新建

实例程序请参考 xmlTester

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航