基本DELPHI中XML编程--简单节点增删改查

来源:互联网 发布:淘宝源代码 编辑:程序博客网 时间:2024/05/16 07:08

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为实体节点的属性节点。

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

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

原创粉丝点击