unit Unit1;interfaceuses 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.