天天看點

Delphi 中的 XMLDocument 類詳解(14) - 周遊 XML 檔案

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;

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

strName := attrList[i].NodeName;

strValue := attrList[i].NodeValue;

str := str + ' ' + strName + '=' + AnsiQuotedStr(strValue, '"');

str := str + '>' + sLineBreak; {sLineBreak 是常量, 相當于 #13#10}

{讀取子節點}

for i := 0 to nodeList.Count - 1 do

strName := nodeList[i].NodeName;

if nodeList[i].IsTextElement then

strValue := nodeList[i].NodeValue;

str := str + '<' + strName + '>' + strValue + '</' + strName + '>' + sLineBreak;

end else if nodeList[i].HasChildNodes then

str := str + ReadXml(nodeList[i]); {這是最關鍵的遞歸調用}

str := str + '</' + strName + '>' + sLineBreak; {封口}

str := str + '</' + node.NodeName + '>'; {封口}

Result := str;

//調用測試(1):

procedure TForm1.Button1Click(Sender: TObject);

str,s1,s2: string;

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 包含問頭在内的所有内容}

//調用測試(2)

procedure TForm1.Button2Click(Sender: TObject);

str: string;

node: IXMLNode;

node := XMLDocument1.DocumentElement.ChildNodes[0];

str := ReadXml(node);

ShowMessage(str); {傳回傳回根節點下第一個子節點的所有内容}

end.

<a></a>

本文轉自黃聰部落格園部落格,原文連結:http://www.cnblogs.com/huangcong/archive/2010/08/27/1809952.html,如需轉載請自行聯系原作者