gpt4 book ai didi

delphi - 使用 TXMLDocument 构建 XML 文档时出现问题

转载 作者:行者123 更新时间:2023-12-03 14:46:01 25 4
gpt4 key购买 nike

我是delphi新手,现在我必须阅读create an x​​ml。我的代码如下:

function foo.createXMLDocument(): TXMLDocument;
var
res: TXMLDocument;
rootNode: IXMLNode;
sl : TStringList;
begin
res := TXMLDocument.Create(nil);
res.Active := true;
rootNode := res.AddChild('label');
// create string for debug purposes
sl := TStringList.Create;
sl.Assign(res.XML);// sl is empty after this assignment
//add more elements
generateDOM(rootNode);

Result := res;
end;

问题是,子节点的数量增加了,但 res.XML 为空。更不用说generateDOM 过程中的其余元素似乎没有做任何事情。我将非常高兴得到您的帮助。

最佳答案

免责声明:使用 D2007 进行测试。

您的代码确实创建了 XML ( <label/> ),如修改后的函数所示:

function createXMLDocument(): TXMLDocument;
var
res: TXMLDocument;
rootNode: IXMLNode;
sl : TStringList;
begin
res := TXMLDocument.Create(nil);
res.Active := true;
rootNode := res.AddChild('label');
// create string for debug purposes
sl := TStringList.Create; // not needed
sl.Assign(res.XML); // Not true: sl is empty after this assignment
ShowMessage(sl.text);// sl is NOT empty!
sl.Free; // don't forget to free it! use try..finally.. to guarantee it!
//add more elements
// generateDOM(rootNode);
Result := res;
end;

但它需要大量评论:
- 您不需要本地 res 变量,只需使用结果即可。
- 您不需要额外的 StringList 来查看 XML:Result.Xml.Text
- 如果您创建了 sl StringList,请不要忘记释放
- 您返回的 XmlDocument 在函数之外无法使用,如果您尝试,则会给出 AV

为什么?
这是因为 XMLDocument 旨在用作具有所有者的组件,或者用作接口(interface),以管理其生命周期
事实上,您使用 Interface 来保存 rootNode 会导致它在 CreateXmlDocument 函数结束时被销毁。如果你看看 TXMLNode._Release 中的代码,你会看到它触发 TXMLDocument._Release除非有 XMLDocument 的所有者(或持有对其引用的接口(interface)),否则它会调用 Destroy。
这就是为什么 XMLDocument 在 CreateXMLDocument 函数内部有效并填充,但在函数外部不可用,除非您返回接口(interface)或提供所有者

请参阅下面的替代解决方案:

function createXMLDocumentWithOwner(AOwner: TComponent): TXMLDocument;
var
rootNode: IXMLNode;
begin
Assert(AOwner <> nil, 'createXMLDocumentWithOwner cannot accept a nil Owner');
Result := TXMLDocument.Create(AOwner);
Result.Active := True;
rootNode := Result.AddChild('label');
OutputDebugString(PChar(Result.Xml.Text));
//add more elements
// generateDOM(rootNode);
end;

function createXMLDocumentInterface(): IXMLDocument;
var
rootNode: IXMLNode;
begin
Result := TXMLDocument.Create(nil);
Result.Active := True;
rootNode := Result.AddChild('label');
OutputDebugString(PChar(Result.Xml.Text));
//add more elements
// generateDOM(rootNode);
end;


procedure TForm7.Button1Click(Sender: TObject);
var
doc: TXmlDocument;
doc2: IXMLDocument;
begin
ReportMemoryLeaksOnShutdown := True;

doc := createXMLDocument;
// ShowMessage( doc.XML.Text ); // cannot use it => AV !!!!
// already freed, cannot call doc.Free;

doc := createXMLDocumentWithOwner(self);
ShowMessage( doc.XML.Text );

doc2 := createXMLDocumentInterface;
ShowMessage( doc2.XML.Text );
end;

关于delphi - 使用 TXMLDocument 构建 XML 文档时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1532353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com