我尝试提取名为 left 的子节点的值,该节点位于名为 design 的节点内,但发生EInvalidPointer
。
我使用的是Delphi 2007,这是XML文本:
<design>
<top>
0
</top>
<left>
5
</left>
<height>
177
</height>
<width>
130
</width>
</design>
这是代码:
uses
XMLDoc, XMLIntf...
var
Stream : TStream;
Doc : TXMLDocument;
Node : IXMLNode;
begin
Stream := TStringStream.Create(Memo1.Lines.Text);
try
Doc := TXMLDocument.Create(nil);
try
Doc.LoadFromStream(Stream);
Node := Doc.ChildNodes.FindNode('design');
if(Node <> nil) then
begin
Node := Node.ChildNodes.FindNode('left'); //EInvalidPointer here
if(Node <> nil) then
begin
//...
end;
end;
finally
Doc.Free;
end;
finally
Stream.Free;
end;
end;
有人可以帮我理解我做错了吗?
答案 0 :(得分:2)
Doc := TXMLDocument.Create(nil);
当您将nil
传递给TXMLDocument
的构造函数时,这意味着您要求通过引用计数来管理生命周期。这意味着您需要将Doc
声明为接口引用:
var
Doc: IXMLDocument;
当然,当您执行此操作时,不要在Free
上致电Doc
,并且可以删除try/finally
块。接口的引用计数由编译器代表您发出的代码自动管理。
如果您想使用类引用,因为您的代码当前已配置,您需要将所有者传递给构造函数。