2017-01-24 6 views
1

Ich versuche, den Wert eines Unterknotens namens links zu extrahieren, die in einem Knoten mit dem Namen Design ist, aber ein EInvalidPointer auftritt.Wie extrahiert man einen Unterknotenwert aus XML-Text?

Ich verwende Delphi 2007 und dies ist der XML-Text:

<design> 
    <top> 
    0 
    </top> 
    <left> 
    5 
    </left> 
    <height> 
    177 
    </height> 
    <width> 
    130 
    </width> 
</design> 

Und das ist der Code:

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; 

Könnte jemand helfen zu verstehen mich, was ich falsch mache?

Antwort

2
Doc := TXMLDocument.Create(nil); 

Wenn Sie nil an den Konstruktor TXMLDocument übergeben, bedeutet, dass Sie für die gesamte Lebensdauer fordern von Referenzzählung verwaltet werden. Was bedeutet, dass Sie Doc als Schnittstelle Bezug deklarieren müssen:

var 
    Doc: IXMLDocument; 

Natürlich, wenn Sie das tun Sie nicht Free auf Doc rufen Sie und der try/finally Block entfernt werden kann. Die Referenzzählung von Schnittstellen wird automatisch durch Code verwaltet, den der Compiler in Ihrem Namen ausgibt.

Wenn Sie eine Klassenreferenz verwenden möchten, müssen Sie dem Konstruktor einen Besitzer übergeben, da Ihr Code derzeit konfiguriert ist.

+0

Warum TButton auf die gleiche Weise verwendet, verursacht keine Probleme? Ist das ein Glücksfall oder gibt es etwas, das TXMLDocument so verhält? – ExDev

+0

@ExDev, Tbutton ist kein Interface-Objekt. – whosrdaddy

+2

TXMLDocument ist speziell –

Verwandte Themen