XML文档简单读写方法 CST 最近参加一个项目需要写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源代码文件,可以在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 |
|