| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

來源:互聯網網民  2006-01-31 22:40:14  評論

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

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
DAY-1 XML文檔簡單讀寫方法 CST 2005-07-08 最近參加一個項目需要寫XML,因此我開始學習XML在delphi中的編程方法,我將我STEP BY STEP的入門過程記錄下來,希望經驗豐富的前輩能給我指點,也希望給像我一樣有意嘗試XML編程的朋友投石問路一下。 本文中使用的一個實例記錄一個學生信息的XML文檔,具體代碼可以訪問我的YAHOO公文包 [url=http://cn.f1.pg.briefcase.yahoo.com/iamcst]http://cn.f1.pg.briefcase.yahoo.com/iamcst[/url] \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
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有