XML 文档的节点是标准的树形结构,可以通过递归或者回溯算法来遍历所有的节点。
    本例使用递归算法为例,制作了2个遍历 XML 文档的例子。
    第一个例子,给出一个 XML 节点,遍历所有子节点-不包括起始节点。
    第二个例子,给出一个 XML 节点,遍历所给的节点及其下属的所有子节点。
    以上2个示例均列举出了 XML 文档的标签属性和文本值,是比较完整的示例代码。

  1. <?xml version=”1.0″ encoding=”gb2312″?> 
  2. <root website=”http://www.why100000.com“> 
  3.   <channel id=”1″ tagname=”channel”> 
  4.     <topic id=”1-1″ tagname=”topic”>Windows频道</topic> 
  5.     <Url id=”1-2″ tagname=”Url”>www.why100000.com/_windows</Url> 
  6.   </channel> 
  7.   <channel id=”2″ tagname=”channel”> 
  8.     <topic id=”2-1″ tagname=”topic”>代码实验室</topic> 
  9.     <subWeb id=”2-2″ tagname=”subWeb”>http://lab.why100000.com</subWeb> 
  10.   </channel> 
  11.   <BBS id=”03″ tagname=”BBS”> 
  12.     <topic id=”03-1″ tagname=”topic”>电脑学习社区</topic> 
  13.     <subWeb id=”03-2″ tagname=”subWeb”>http://bbs.why100000.com</subWeb> 
  14.     <subBBS id=”03-3″> 
  15.       <subBBStopic id=”03-3-1″>菜鸟学院</subBBStopic> 
  16.       <subBBStopic id=”03-3-2″>问吧</subBBStopic> 
  17.       <subBBStopic id=”03-3-3″>学吧</subBBStopic> 
  18.       <subBBStopic id=”03-3-4″>回吧</subBBStopic> 
  19.       <subBBStopic id=”03-3-5″></subBBStopic> 
  20.       <subBBStopic></subBBStopic> 
  21.     </subBBS> 
  22.   </BBS> 
  23.   <AnatherTag note=”testTag-1″/> 
  24.   <AnatherTag/> 
  25. </root> 
  26. {———————————————————————-}  
  27. function TForm1.GetXmlTree1(nNode: IXMLNode): string;  
  28. var  
  29.   i, j: integer;  
  30. begin  
  31.   for i:=0 to nNode.ChildNodes.Count-1 do  
  32.   begin  
  33.     s :s + ‘<’ + nNode.ChildNodes.Nodes[i].NodeName;  
  34.     for j:=0 to nNode.ChildNodes[i].AttributeNodes.Count-1 do  
  35.     begin  
  36.       s :s + ‘ ‘+ nNode.ChildNodes[i].AttributeNodes[j].NodeName;  
  37.       s :s + ‘=”‘+ nNode.ChildNodes[i].AttributeNodes[j].NodeValue +’”‘;  
  38.     end;  
  39.     s :s + ‘>’;  
  40.     if nNode.ChildNodes.Nodes[i].IsTextElement then  
  41.       s :s + nNode.ChildNodes.Nodes[i].Text;  
  42.     if nNode.HasChildNodes and not nNode.ChildNodes.Nodes[i].IsTextElement then  
  43.     begin  
  44.       s :s +  #13 + #10;  
  45.       GetXmlTree1(nNode.ChildNodes.Nodes[i]);  
  46.     end;  
  47.     s :s + ‘</’+ nNode.ChildNodes.Nodes[i].NodeName +’>’ + #13 + #10;  
  48.   end;  
  49.   result :s;  
  50. end;  
  51. {———————————————————————-}  
  52. function TForm1.GetXmlTree2(nNode: IXMLNode): string;  
  53. var  
  54.   i, j: integer;  
  55. begin  
  56.   s :s + ‘<’ + nNode.NodeName;  
  57.   for j:=0 to nNode.AttributeNodes.Count-1 do  
  58.   begin  
  59.     s :s + ‘ ‘+ nNode.AttributeNodes[j].NodeName;  
  60.     s :s + ‘=”‘+ nNode.AttributeNodes[j].NodeValue +’”‘;  
  61.   end;  
  62.   s :s + ‘>’;  
  63.   if nNode.IsTextElement then  
  64.     s :s + nNode.Text  
  65.   else  
  66.   begin  
  67.     s :s + #13 + #10;  
  68.     if nNode.HasChildNodes then  
  69.       for i:=0 to nNode.ChildNodes.Count-1 do  
  70.       begin  
  71.         GetXmlTree2(nNode.ChildNodes.Nodes[i]);  
  72.       end;  
  73.   end;  
  74.   s :s + ‘</’ + nNode.NodeName + ‘>’+ #13 + #10;  
  75.   result :s;  
  76. end;  
  77. {———————————————————————-}  
  78. 调用:  
  79.  
  80. procedure TForm1.Button4Click(Sender: TObject);  
  81. var  
  82.   oXml: TXMLDocument;  
  83. begin  
  84.   oXml :TXMLDocument.Create(self);  
  85.   oXml.FileName := ‘_Treeview.xml’;  
  86.   oXml.Active:=true;  
  87.   s :=”;  
  88.   s :GetXmlTree1(oXml.ChildNodes.FindNode(’root’));  
  89.   Memo1.Lines.Add(s);  
  90.   oXml.Free;  
  91. end;  
  92.  
  93. procedure TForm1.Button5Click(Sender: TObject);  
  94. var  
  95.   oXml: TXMLDocument;  
  96. begin  
  97.   oXml :TXMLDocument.Create(self);  
  98.   oXml.FileName := ‘_Treeview.xml’;  
  99.   oXml.Active:=true;  
  100.   s :=”;  
  101.   s :GetXmlTree2(oXml.ChildNodes.FindNode(’root’));  
  102.   Memo1.Lines.Add(s);  
  103.   oXml.Free;  
  104. end;