程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 中的 XMLDocument 類詳解(14) - 遍歷 XML 文件

Delphi 中的 XMLDocument 類詳解(14) - 遍歷 XML 文件

編輯:Delphi

unit Unit1; 
 
interface 
 
uses 
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
 Dialogs, xmldom, XMLIntf, msxmldom, XMLDoc, StdCtrls; 
 
type 
 TForm1 = class(TForm) 
  XMLDocument1: TXMLDocument; 
  Button1: TButton; 
  Button2: TButton; 
  procedure Button1Click(Sender: TObject); 
  procedure Button2Click(Sender: TObject); 
 end; 
 
var 
 Form1: TForm1; 
 
implementation 
 
{$R *.dfm} 
 
 
//讀取 xml 的函數 
{ 
 功能1: 傳入一個節點參數, 返回節點及其包含的所有內容; 
 功能2: 排除了空節點. 
} 
function ReadXml(node: IXMLNode): string; 
var 
 nodeList,attrList: IXMLNodeList; 
 str,strName,strValue: string; 
 i: Integer; 
begin 
 Result := ''; 
 if not node.HasChildNodes then Exit; 
 
 attrList := node.AttributeNodes;   {根節點的屬性列表} 
 nodeList := node.ChildNodes;     {根節點下的子節點列表} 
 
 str := '<' + node.NodeName; 
 
 {先讀取屬性} 
 for i := 0 to attrList.Count - 1 do 
 begin 
  strName := attrList[i].NodeName; 
  strValue := attrList[i].NodeValue; 
  str := str + ' ' + strName + '=' + AnsiQuotedStr(strValue, '"'); 
 end; 
 str := str + '>' + sLineBreak; {sLineBreak 是常量, 相當於 #13#10} 
 
 {讀取子節點} 
 for i := 0 to nodeList.Count - 1 do 
 begin 
  strName := nodeList[i].NodeName; 
  if nodeList[i].IsTextElement then 
  begin 
   strValue := nodeList[i].NodeValue; 
   str := str + '<' + strName + '>' + strValue + '</' + strName + '>' + sLineBreak; 
  end else if nodeList[i].HasChildNodes then 
  begin 
   str := str + ReadXML(nodeList[i]);        {這是最關鍵的遞歸調用} 
   str := str + '</' + strName + '>' + sLineBreak; {封口} 
  end; 
 end; 
 
 str := str + '</' + node.NodeName + '>'; {封口} 
 
 Result := str; 
end; 
 
 
//調用測試(1): 
procedure TForm1.Button1Click(Sender: TObject); 
var 
 str,s1,s2: string; 
begin 
 XMLDocument1.LoadFromFile('c:\temp\test.XML'); 
 {必須用萬一提供的 XML 測試文件, 才能有相同的返回值} 
 
 
 {讀取文件頭} 
 s1 := AnsiQuotedStr(XMLDocument1.Version, '"'); {讀出版本, 並添加雙引號} 
 s2 := AnsiQuotedStr(XMLDocument1.Encoding, '"'); {讀出字符集, 並添加雙引號} 
 str := Format('<?XML version=%s encoding=%s?>',[s1,s2]); {這就是文件頭了} 
 
 str := str + sLineBreak + ReadXml(XMLDocument1.DocumentElement); 
 
 ShowMessage(str); {返回 XML 包含問頭在內的所有內容} 
end; 
 
 
//調用測試(2) 
procedure TForm1.Button2Click(Sender: TObject); 
var 
 str: string; 
 node: IXMLNode; 
begin 
 XMLDocument1.LoadFromFile('c:\temp\test.XML'); 
 
 node := XMLDocument1.DocumentElement.ChildNodes[0]; 
 
 str := ReadXML(node); 
 
 ShowMessage(str); {返回返回根節點下第一個子節點的所有內容} 
end; 
 
end. 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved