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