我写了一个递归函数 让他返回找到的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.
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.
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.
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
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;
但是跳出递归 showmessage( find(root).attributes[0].text);就出错应该他也显示 value才对
if node.childNodes[i].childNodes.length > 0 then
find(node.childNodes[i]);//这里才是返回的地方,你showmessage是查到了但是你没有返回,这是递归知道么!!!!!