【我愛DELPHI,我學XML】DAY 1:簡單節點增刪改查

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

 
動態增加xml對象節點函數
function AppendRect() //將物理列值保存到oRect對象中 { var root = oRect.documentElement var newNode = oCoor.createNode (1, "record", "") root.appendChild(newNode) var newElem = oCoo...查看完整版>>動態增加xml對象節點函數
 
動態增加xml對象節點函數
function AppendRect() //將物理列值保存到oRect對象中 { var root = oRect.documentElement var newNode = oCoor.createNode (1, "record", "") root.appendChild(newNode) var newElem = oCoor.createElement("row...查看完整版>>動態增加xml對象節點函數
 
簡析Delphi中的XML編程
甯波吉聯計算機技術有限公司研發部 徐榮勝 XML(eXtensible Markup Language可擴展標志語言)在近幾年的信息類雜志、網站上可謂是最搶眼的一詞。大大小小的信息産品都爭相和它搭上關系,唯恐趕不及這輛快車。有著良好...查看完整版>>簡析Delphi中的XML編程
 
在delphi中使用xml文檔有兩種方法
在delphi中使用xml文檔有兩種方法 使用xml broker, 是delphi 內置的。例: unit ShowXML; interface uses Classes HTTPApp Db DbClient Midas XMLBrokr WebComp MidItems; type TCustomShowXMLButt...查看完整版>> 在delphi中使用xml文檔有兩種方法
 
在delphi中使用xml文檔有兩種方法
在delphi中使用xml文檔有兩種方法 使用xml broker, 是delphi 內置的。例: unit ShowXML; interface uses Classes HTTPApp Db DbClient Midas XMLBrokr WebComp MidItems; type TCustomShowXMLButton = cl...查看完整版>>在delphi中使用xml文檔有兩種方法