2017-01-24 8 views
1

Я пытаюсь извлечь значение подзаголовка с именем слева, который находится внутри узла с именем дизайн, но происходит EInvalidPointer.Как извлечь значение субнома из текста XML?

Я использую 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; 

Может кто-то помочь мне понять, что я делаю неправильно?

ответ

2
Doc := TXMLDocument.Create(nil); 

Когда вы передаете nil конструктору TXMLDocument, что означает, что вы просите за всю жизнь будет управляться подсчетом ссылок. Это означает, что вам нужно объявить Doc в качестве интерфейсной ссылки:

var 
    Doc: IXMLDocument; 

Естественно, когда вы делаете это, вы не звоните Free на Doc и try/finally блок может быть удален. Сопоставление ссылок интерфейсов автоматически управляется кодом, который компилятор испускает от вашего имени.

Если вы хотите использовать ссылку на класс, так как ваш код в настоящее время настроен, вам необходимо передать владельца конструктору.

+0

Почему использование TButton таким же образом не вызывает проблем? Это счастливый случай или есть что-то, что делает TXMLDocument так себя вести? – ExDev

+0

@ExDev, Tbutton не является сопряженным объектом. – whosrdaddy

+2

TXMLDocument является специальным –

Смежные вопросы