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.