如何从XML文本中提取子节点值?

时间:2017-01-24 09:07:37

标签: xml delphi

我尝试提取名为 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;

有人可以帮我理解我做错了吗?

1 个答案:

答案 0 :(得分:2)

Doc := TXMLDocument.Create(nil);

当您将nil传递给TXMLDocument的构造函数时,这意味着您要求通过引用计数来管理生命周期。这意味着您需要将Doc声明为接口引用:

var
  Doc: IXMLDocument;

当然,当您执行此操作时,不要在Free上致电Doc,并且可以删除try/finally块。接口的引用计数由编译器代表您发出的代码自动管理。

如果您想使用类引用,因为您的代码当前已配置,您需要将所有者传递给构造函数。