- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的函数接受 XML 输入,对其进行解析,然后返回一个普通字符串,该字符串仅显示在调用方函数中。因此上下文中的对象是下面函数的内部对象。
但是这个函数有一个奇怪的问题,它会记住输入,这意味着对象没有正确释放。即使输入被检查为不同,输出字符串也有一部分是由先前调用产生的。
在将 XMLDoc、IXMLNodeList 中的每一个分配给 nil 之前,我还尝试在循环中释放通过将 nil 分配给 Item 数组直接引用的每个 IXMLNode,但是该分配语句导致了语法错误,因此解决了以下问题。
function tform1.nodeToSentence(nodeXml: string): string ;
var
tempXmlDoc : IXMLDocument;
resultWordPuncNodes : IXMLNodeList;
i: Integer;
begin
tempXmlDoc := CreateXMLDoc;
tempXmlDoc.LoadXML(nodeXml);
resultWordPuncNodes := XPathSelect(tempXmlDoc.DocumentElement,'//*');
for i:= 0 to resultWordPuncNodes.Length-1 do
begin
if resultWordPuncNodes.Item[i].NodeName = 'name' then
begin
if resultWordPuncNodes.Item[i].Attributes['attrib'] = 'v_attrib' then
begin
Result := TrimRight(Result);
Result := Result + resultWordPuncNodes.Item[i].Text + ' ';
end
else Result := Result + resultWordPuncNodes.Item[i].Text + ' ';
end;
end;
resultWordPuncNodes:=nil;
tempXmlDoc := nil; //interface based objects are freed this way
end;
调用代码
//iterating over i
nodeXML := mugList.Strings[i];
readableSentence := nodeToSentence(mugList.Strings[i]);
//examplesList.Append(readableSentence);
//for debugging
showMessage(readableSentence);
//iteration ends
最佳答案
But this function has a strange problem that, it remembers the input which means that the objects are not released properly. Output string has a part resulting from the previous call even if the input is checked to be different.
这是因为String
返回函数
的值(以及其他ARC管理类型,以及记录
,对象
和方法指针)使用隐藏的var
参数在调用者和被调用者之间传递,该参数在输入函数时不会自动清除,就像您一样期待。
这段代码:
function tform1.nodeToSentence(nodeXml: string): string ;
...
readableSentence := nodeToSentence(mugList.Strings[i]);
实际上与此代码相同:
procedure tform1.nodeToSentence(nodeXml: string; var Result: string);
...
nodeToSentence(mugList.Strings[i], readableSentence);
多次调用nodeToSentence()
,您可能会将越来越多的文本附加到同一个String
变量。
在函数内部,您需要手动重置 Result
值,然后再开始将新值连接到其中:
function tform1.nodeToSentence(nodeXml: string): string ;
var
...
begin
Result := ''; // <-- add this!
...
end;
关于delphi - 无法释放 IXMLDocument、IXMLNodeList 或其他(omnixml 的)接口(interface)类型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41026057/
人们似乎对 OmniXML 抱有很大的热情,但omnixml.com 已经离线,Google Code 项目也空了。这个库发生了什么?我在哪里可以找到代码(因为它是开源的)? 最佳答案 OmniXML
我想删除 rowpath 部分中带有 pathid="2" 的行... 我怎样才能做到这一点? 最佳答案 尝试使用这个。 uses OmniXML, OmniX
我目前正在使用 OmniXML 单元在 Delphi XE 中操作我的 XML 文件。我设法从磁盘上的文件加载 XML 内容,现在我想在特定节点元素下添加一个子节点。新的子节点还将具有“id”属性。不
在使用默认的 msxml 实现多年之后,我正在尝试 OmniXML。我有几个 xml 结构(其中一些非常庞大),我最初使用 Delphi 向导为其创建了一个绑定(bind)。然后手动编辑绑定(bind
我想创建这个结构 xml 当我做主要结构时,我从在线数据库获取数据,我想将其添加到我的 xml 文件中 如何创建主要结构 如
我有一个 XML,其中一个节点有多个属性: var row : IXMLNode; rowattr : IXMLAttr; xml : IXMLDocument; begin xm
我正在考虑将应用程序设置保存为 xml,而不是使用注册表,但我很难理解和使用 OmniXML。 我知道你们中的一些人使用并推荐 OnmiXML,所以我希望有人能给我一些指示。 如果新 key 不存在,
我最近改用 Delphi XE7 中包含的 OmniXML,以允许针对 iOS。 XML 数据来自云服务,包含具有 Base64 编码二进制数据的节点。 现在,在调用 XMLDocument.Load
我正在寻找一些实际工作的示例代码,以使用普通的 OmniXml(或 OmniXmlUtils)单元读取 XML。我不想使用 TOmniXMLWriter 类,如其他地方所述,但想使用纯 Delphi
我得到了以下 XML 片段,作为我正在使用最新的 OmniXML 快照进行处理的较大 XML 文件的一部分:
我在 Embarcadero 的“Delphi 和 C++Builder XE7 中的新增功能”页面上阅读了 here关于 OmniXML 的 SOAP 支持。 New Cross-Platform
我有一个很大的 XML 文件,大约 50 兆,我试图使用 OmniXML操作 XML 文档的库。 我不明白 OmniXML 中的演示... XML 文件的结构如下: Rol
我最近开始使用 OmniXML,主要是因为它可用于 Delphi 和 Lazarus。 我自己是 XML 的初学者,我希望在这里可以学到一些东西或避免做任何我可能已经在做的坏事。 为此,我将使用另一个
这个问题已经有答案了: What is the default value of 'Result' in Delphi? (3 个回答) 已关闭 6 年前。 下面的函数接受 XML 输入,对其进行解析
我知道这可能是一个简单的问题,但我在互联网上搜索后找不到答案。我正在尝试安装 OExport - XLSX/ODS native Delphi/Lazarus 导入/导出库 http://www.kl
我是一名优秀的程序员,十分优秀!