分享
 
 
 

【我爱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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有