2017-01-24 99 views
1

我試圖提取名爲左側的子節點的值,它位於名爲設計的節點內,但發生了EInvalidPointer如何從XML文本中提取子節點值?

我使用的是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; 

有人能幫助我理解我在做什麼錯?

回答

2
Doc := TXMLDocument.Create(nil); 

當你通過nilTXMLDocument構造這意味着你所要求的壽命被引用計數進行管理。這意味着你需要聲明Doc作爲接口參考:

var 
    Doc: IXMLDocument; 

自然,如果你這樣做,你不要打電話DocFreetry/finally塊可以被刪除。接口的引用計數由編譯器以您的名義發出的代碼自動管理。

如果您想使用類引用,因爲您的代碼當前已配置,您需要將所有者傳遞給構造函數。

+0

爲什麼以同樣的方式使用TButton不會導致問題?這是一個幸運的案例還是有什麼使TXMLDocument的行爲? – ExDev

+0

@ExDev,Tbutton不是一個接口對象。 – whosrdaddy

+2

TXMLDocument是特殊的 –