黄聪: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;

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.

出处:http://www.cnblogs.com/del/archive/2008/01/03/1025133.html