0

我尝试开发一个助手来读取/写入和控制 TXMLDocument 的实例。我为这项工作编写了一个简单的单元。该单元有一个程序,将实例分配给全局变量,并设置一些变量用于文档控制。单位是:

unit Globals;

{ Variables globales de la aplicacion, con sus correspondientes accessors }

interface

uses
  { XML Helper }
  xmldom, XMLIntf, msxmldom, XMLDoc, SysUtils, DateUtils;

type
  XmlCheckPoint = Record
    asociado: boolean;
    xmlFile: TXMLDocument;
    saved: boolean;
    lastModification: TDateTime;
    lastSave: TDateTime;
    path: TFilename;
  End;

  { Firmas }
  procedure assignXml(var aXml: TXMLDocument);
  procedure xmlWriteProyectoNode(obra,cliente,ubicacion,fecha,sondeo,estudio: String);
  function existsXml(): boolean;
  function xmlIsUpdated(): boolean;

var
  Xml: XmlCheckPoint;

过程 assignXml,工作正常:

  procedure assignXml(var aXml: TXMLDocument);
  begin
    Xml.xmlFile := aXml;
    Xml.asociado := true;
    Xml.saved := false;
    Xml.lastSave := Yesterday;
    Xml.path := '';
    { Inserto el nodo raiz }
    Xml.xmlFile.Active := true;
    Xml.xmlFile.AddChild('raiz');
    Xml.lastModification := Now();
  end;

但是, xmlWriteProyectoNode(...) 会爆炸应用程序:

procedure xmlWriteProyectoNode(obra,cliente,ubicacion,fecha,sondeo,estudio: String);
  var
    root,meta,child: IXMLNode;
  begin
    Xml.xmlFile.Active := true;
    root := Xml.xmlFile.DocumentElement;
    meta := root.AddChild('proyecto');
    child := meta.AddChild('obra');
    child.Text := obra;
      [...]
    Xml.lastModification := Now();
  end;

当调用 writeXmlProyectoNode(...) 并出现访问冲突错误时,应用程序崩溃。在执行时间。Embarcadero 调试器说有冲突的行是:

root := Xml.xmlFile.DocumentElement;

我需要获取根元素,并且认为这是正确的方法...我在 Delphi 中是最新的,有什么想法吗?谢谢 !。

编辑:XML 创建(newXml类型为TXMLDocument

newXml := TXMLDocument.Create(nil);
newXml.Options := [doNodeAutoIndent];
newXml.Active := true;
{ Asocio la instancia de XMLDocument a mi variable global newXml}
Globals.assignXml(newXml);
4

1 回答 1

3
   var newXml: TXMLDocument; // instead of "iXMLDocument"
   newXml := TXMLDocument.Create(nil);

现在请阅读有关在有或没有所有者的情况下创建文档的文档。

您应该将它创建为普通对象,直到您.Free拥有它 - 但它应该有一个所有者。

或者您应该使用引用计数接口,并且始终保持至少一个链接到文档的变量处于活动状态。

后一种方法在文档中再次显示在...中:

阅读文档

PS。

于 2013-07-13T22:33:06.303 回答