Delphi: EInvalidPointer при попытке доступа к XMLDocument

Следующий код генерирует исключение "InvalidPointer" каждый раз, когда я пытаюсь получить доступ к корню документа с XMLDocument.DocumentElement;,

    begin
      XMLDocument := TXMLDocument.Create(nil); // nil since we don't need an owner
      AStream := TStream.Create;  // stream for output as string
      XMLDocument.loadFromXML(xml);// load string
      if NOT (XMLDocument.IsEmptyDoc) then
       begin      
        XMLDocument.Active := true; // actually automatically done by 'loadFromXML'

        // get document root
        HeadNode := XMLDocument.DocumentElement;

        // add <id>-element, set ID as text
        idNode := HeadNode.AddChild(XML_ID_PLAIN);
        idNode.Text := id;

        // ...
     end;
    end;

Строка "xml" передана loadFromXML(string) допустимый XML, но свойства XMLDocument "XML" и "DOMDocument" всегда nil, хотя ни сам объект, ни его свойства "IsEmptyDoc" не являются. Версия Delphi по-прежнему 2007.

Кто-нибудь знает, что вызывает это? Заранее спасибо.

1 ответ

Решение

Обратите внимание, что это не ответит на ваш вопрос, почему происходит то, что вы описали, но пытается предложить вам правильный способ сделать то, что вы хотите. Использовать LoadXMLData функция вместо создания TXMLDocument пример самостоятельно. Вот пример кода:

uses
  XMLIntf, XMLDoc;

const
  XMLString =
    '<?xml version="1.0" encoding="UTF-8"?>' +
    '<Setup>' +
    '  <FirstNode>First Node Value</FirstNode>' +
    '  <SecondNode>Second Node Value</SecondNode>' +
    '</Setup>';

procedure TForm1.Button1Click(Sender: TObject);
var
  HeadNode: IXMLNode;
  XMLDocument: IXMLDocument;
begin
  try
    XMLDocument := LoadXMLData(XMLString);
    HeadNode := XMLDocument.DocumentElement;
    if Assigned(HeadNode) then
      ShowMessage(HeadNode.NodeName);
  except
    on E: Exception do
      ShowMessage(E.Message);
  end;
end;
Другие вопросы по тегам