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

 
DAY-1

XML文档简单读写方法

CST 2005-07-08

 

 

基本介绍

本文档描述采用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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

也可以电邮我。

/BLOG附件/XML_DAY_01_BASIC_NODE

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值