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