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
|