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

标签 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;

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

最佳答案

Doc := TXMLDocument.Create(nil);

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

var
  Doc: IXMLDocument;

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

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

关于xml - 如何从 XML 文本中提取子节点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41824079/

相关文章:

c++ - 将 C++ 翻译成 Delphi,或转换成 dll

windows - 为什么 TFontDialog 提供的字体比 Screen.Fonts 少?

java - 如何将 InputStream 转换为 InputSource?

delphi - 打开文件的上下文对话框、默认操作等

sqlite - 在 TSQLQuery 中使用 as

delphi - 从 Firefox 复制图像时出现黑色背景

xml - 找不到元素 'context:annotation-config' 的声明

c++ - C/C++ 的 StAX 编写器实现

xml - 多个用户同时更新 XML 文件

java - 仅在 jaxb 中枚举限制默认值