2

次のコードは、ドキュメントのルートにアクセスしようとするたびに「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 のままです。

誰がこれを引き起こしているのか考えていますか? 前もって感謝します。

4

1 に答える 1

6

これは、あなたが説明したことがなぜ起こるのかという質問には答えませんが、あなたが望むことを行う正しい方法を提供しようとすることに注意してください. 自分でインスタンス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;
于 2012-10-12T12:46:22.797 に答える