我写了一个递归函数 让他返回找到的xml节点 但奇怪的是 他返回了一个nil 这是为什么呢 代码附上 贴上就能运行
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,MSXML, ComObj;type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
    XmlDoc: IXMLDomDocument;
  root: IXMLDOMNode;
implementation{$R *.dfm}
function find(node:IXMLDOMNode):IXMLDOMNode;
var
  i, j: integer;
begin
    for i := 0 to node.childNodes.length - 1 do
  begin
    if node.childNodes[i].nodeName = 'table' then
    begin
      for j := 0 to node.childNodes[i].attributes.length - 1 do
      begin
        if (node.childNodes[i].attributes[j].nodeName = 'name') and (node.childNodes[i].attributes[j].nodeValue = 'value') then
        begin
           showmessage( node.childNodes[i].text);//显示正常说明node.childNodes[i]不是nil;
          result :=  node.childNodes[i];
exit;
        end;
      end;
    end;
    if node.childNodes[i].childNodes.length > 0 then
      find(node.childNodes[i]);
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
  xmlabt: IXMLDOMAttribute;
  xmlnode,xmlnode1: IXMLDOMElement;begin
  XmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument;
  root := XmlDoc.CreateElement('start');
  XmlDoc.AppendChild(root);
  xmlnode := xmldoc.createElement('db');
  root.AppendChild(xmlnode);  xmlnode1 := xmldoc.createElement('table');
  xmlabt := xmldoc.createAttribute('name');
  xmlabt.text := 'value';
  xmlnode1.setAttributeNode(xmlabt);
   xmlnode.AppendChild(xmlnode1);
   showmessage( find(root).attributes[0].text);//这里出错原因是递归函数返回了个nil也就是说返回的IXMLDOMNode 是nil//
            xmldoc.save('c:\222.xml');
end;end.

解决方案 »

  1.   

    //更正一下
    unit Unit1;interface uses 
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
      Dialogs,MSXML, ComObj; type 
      TForm1 = class(TForm) 
        procedure FormCreate(Sender: TObject); 
      private 
        { Private declarations } 
      public 
        { Public declarations } 
      end; var 
      Form1: TForm1; 
        XmlDoc: IXMLDomDocument; 
      root: IXMLDOMNode; 
    implementation {$R *.dfm} 
    function find(node:IXMLDOMNode):IXMLDOMNode; 
    var 
      i, j: integer; 
    begin 
        for i := 0 to node.childNodes.length - 1 do 
      begin 
        if node.childNodes[i].nodeName = 'table' then 
        begin 
          for j := 0 to node.childNodes[i].attributes.length - 1 do 
          begin 
            if (node.childNodes[i].attributes[j].nodeName = 'name') and (node.childNodes[i].attributes[j].nodeValue = 'value') then 
            begin 
              showmessage( node.childNodes[i].attributes[0].text);//显示正常说明node.childNodes[i]不是nil;
              result :=  node.childNodes[i]; 
    exit; 
            end; 
          end; 
        end; 
        if node.childNodes[i].childNodes.length > 0 then 
          find(node.childNodes[i]); 
      end; 
    end; 
    procedure TForm1.FormCreate(Sender: TObject); 
    var 
      xmlabt: IXMLDOMAttribute; 
      xmlnode,xmlnode1: IXMLDOMElement; begin 
      XmlDoc := CreateOleObject('Microsoft.XMLDOM') as IXMLDomDocument; 
      root := XmlDoc.CreateElement('start'); 
      XmlDoc.AppendChild(root); 
      xmlnode := xmldoc.createElement('db'); 
      root.AppendChild(xmlnode);   xmlnode1 := xmldoc.createElement('table'); 
      xmlabt := xmldoc.createAttribute('name'); 
      xmlabt.text := 'value'; 
      xmlnode1.setAttributeNode(xmlabt); 
      xmlnode.AppendChild(xmlnode1); 
      showmessage( find(root).attributes[0].text);//这里出错原因是递归函数返回了个nil也就是说返回的IXMLDOMNode 是nil//
                xmldoc.save('c:\222.xml'); 
    end; end. 
      

  2.   

    我靠 看来是msxml 的bug 我用vb重写也是出错
    Dim xmldoc As New MSXML.DOMDocument
    Private Sub Form_Load()
    Dim root As IXMLDOMNode
    Dim node As IXMLDOMNode
    Dim node1 As IXMLDOMElement
    Dim xmlabt As IXMLDOMAttribute
    Set root = xmldoc.createElement("start")
    Set node = xmldoc.createElement("db")
    Call xmldoc.appendChild(root)
    Call root.appendChild(node)
    Set node1 = xmldoc.createElement("table")Set xmlabt = xmldoc.createAttribute("name")
      xmlabt.Text = "value"
     Call node1.setAttributeNode(xmlabt)
    Call node.appendChild(node1)
    xmldoc.save "c:\1.xml"MsgBox find(root).Attributes.lengthEnd SubFunction find(node As IXMLDOMElement) As IXMLDOMElement
    Dim i As Integer, j As Integer
    For i = 0 To node.childNodes.length - 1
        If node.childNodes(i).nodeName = "table" Then
             For j = 0 To node.childNodes(i).Attributes.length - 1
              
                    If node.childNodes(i).Attributes(j).nodeName = "name" And node.childNodes(i).Attributes(j).nodeValue = "value" Then
                    
                        MsgBox node.childNodes(i).Attributes(0).Text
                        Set find = node.childNodes(i)
                        Exit Function
                    End If
            Next j
        End If
        If node.childNodes(i).childNodes.length > 0 Then
          Call find(node.childNodes(i))
    End If
    Next iEnd Function
      

  3.   

    不要动不动就说是bug,首先 msxml 查找节点根本用不着递归,xpath足可以完成你想要的任何查询操作。再则,就算用递归,你这递归明显有问题,你递归的时候根本就没有返回值。function find(node:IXMLDOMNode):IXMLDOMNode; 
    var 
      i, j: integer; 
    begin 
        for i := 0 to node.childNodes.length - 1 do 
      begin 
        if node.childNodes[i].nodeName = 'table' then 
        begin 
          for j := 0 to node.childNodes[i].attributes.length - 1 do 
          begin 
            if (node.childNodes[i].attributes[j].nodeName = 'name') and (node.childNodes[i].attributes[j].nodeValue = 'value') then 
            begin 
              showmessage( node.childNodes[i].attributes[0].text);//显示正常说明node.childNodes[i]不是nil; 
              result :=  node.childNodes[i]; 
    exit; 
            end; 
          end; 
        end; 
        if node.childNodes[i].childNodes.length > 0 then 
          find(node.childNodes[i]); //这里
      end; 
    end; 
      

  4.   

    楼上的有返回值 我已经  showmessage( node.childNodes[i].attributes[0].text); 
      

  5.   

    递归里面 showmessage( node.childNodes[i].attributes[0].text);  他显示value 就是我想要的.
    但是跳出递归  showmessage( find(root).attributes[0].text);就出错应该他也显示 value才对
      

  6.   

    真够犟的,你根本没有返回,
        if node.childNodes[i].childNodes.length > 0 then 
          find(node.childNodes[i]);//这里才是返回的地方,你showmessage是查到了但是你没有返回,这是递归知道么!!!!!