gpt4 book ai didi

xml - 如何在 OmniXML 和 Delphi 自己的 XML 库之间转换代码?

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:02 28 4
gpt4 key购买 nike

我最近开始使用 OmniXML,主要是因为它可用于 Delphi 和 Lazarus。

我自己是 XML 的初学者,我希望在这里可以学到一些东西或避免做任何我可能已经在做的坏事。

为此,我将使用另一个问题作为引用:Saving and Loading Treeview using XML

bummi 的回答之一中,我认为他在 Delphi 中使用标准 XML,而我在 Lazarus 中使用 OmniXML,因此他在答案中发布的代码无法编译。在更改了一些代码后,我现在可以使用它了,但我需要知道以下内容是否正确:


(1) 变量类型

德尔福

TTreeToXML = Class
private
FDOC: TXMLDocument;
FRootNode: IXMLNode;

OmniXML

TTreeToXML = Class
private
FDOC: IXMLDocument;
FRootNode: IXMLElement;

(2) 创建XML文档

德尔福

FDOC := TXMLDocument.Create(nil);

OmniXML

FDOC := CreateXMLDoc; 

(3) 释放XML文档

德尔福

if Assigned(FDOC) then
FDOC.Free;

OmniXML

我找不到释放文档的方法?


(4) 属性

德尔福

Procedure TTreeToXML.WriteNode(N: TTreeNode; ParentXN: IXMLNode);
var
CurrNode: IXMLNode;
Child: TTreeNode;
begin
CurrNode := ParentXN.AddChild(N.Text);
CurrNode.Attributes['NodeLevel'] := N.Level;
CurrNode.Attributes['Index'] := N.Index;
Child := N.getFirstChild;
while Assigned(Child) do
begin
WriteNode(Child, CurrNode);
Child := Child.getNextSibling;
end;
end;

OmniXML

Procedure TTreeToXML.WriteNode(N: TTreeNode; ParentXN: IXMLNode);
var
CurrNode: IXMLNode;
Child: TTreeNode;
begin
CurrNode := ParentXN.AddChild(N.Text);
CurrNode.Attributes.SetValue('NodeLevel', IntToStr(N.Level));
CurrNode.Attributes.SetValue('NodeIndex', IntToStr(N.Index));
Child := N.getFirstChild;
while Assigned(Child) do
begin
WriteNode(Child, CurrNode);
Child := Child.getNextSibling;
end;
end;

(5) 选项

德尔福

FDOC.Options := FDOC.Options + [doNodeAutoIndent];

OmniXML

文档自动缩进保存,我找不到任何选项?


(6) 活跃

德尔福

FDOC.Active := true;

OmniXML

我没有办法将这样的属性设置为 True 或 False?


(七)编码

德尔福

FDOC.Encoding := 'UTF-8';

OmniXML

我又没看到这样的选项?


所以基本上我想我想知道 Delphi XML 和 OmniXML 实现之间的区别是什么。

我所做的更改是否正确?

我找不到选项和编码等属性,我该如何在 OmniXML 中实现它?

谢谢。

最佳答案

(1) 变量类型

TTreeToXML = Class
private
FDOC: IXMLDocument;
FRootNode: IXMLNode;

(2) 创建XML文档

好的。

(3) 释放XML文档

不需要免费。它的界面基于。您可以像这样明确地释放它:

FDOC := nil;

前提是您没有任何其他引用。

(4) 属性

应该没问题。没有深入研究。

(5) 选项

您在保存 XML 文档时控制缩进。

procedure TXMLDocument.Save(const FileName: string; const OutputFormat: TOutputFormat = ofNone);

这就是 OutputFormat 的用途。从文件或流加载 XML 时,还要检查“PreserveWhiteSpace”属性。

(6) 活跃

什么是事件?我认为没有必要。

(七)编码

使用:

function CreateProcessingInstruction(const Target, Data: XmlString): IXMLProcessingInstruction;

比如这样写:

<?xml version="1.0" encoding="UTF-8" ?>

如果您保存文档并且您想要指定编码。如果 BOM 存在,OmniXML 几乎可以读取任何编码。


无论如何,OmniXML 与 TXMLDocument 非常相似。更改主要在程序员界面中,并且 OmniXML 与 MSXML 兼容。

你也可以查看我的SimpleStorage这是 OmniXML 之上的一组接口(interface),大大简化了它。只需查看演示,看看我的意思。但不幸的是,它在 Lazarus 下不起作用。

关于xml - 如何在 OmniXML 和 Delphi 自己的 XML 库之间转换代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591011/

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