我最近开始使用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) Activity 的

德尔斐
FDOC.Active := true;

OmniXML

我看不到将这样的属性设置为True或False的方法吗?

(7)编码

德尔斐
FDOC.Encoding := 'UTF-8';

OmniXML

同样,我看不到这样的选择吗?

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

我所做的更改是否正确?

我找不到的属性(例如选项和编码),如何在OmniXML中实现呢?

谢谢。

最佳答案

(1)变量类型

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

(2)创建XML文档

好的。

(3)释放XML文档

不需要免费。其基于接口(interface)。您可以像这样显式地释放它:
FDOC := nil;

前提是您没有其他引用。

(4)属性

可能还可以。没有太多研究。

(5)选项

保存XML文档时,您可以控制缩进。
procedure TXMLDocument.Save(const FileName: string; const OutputFormat: TOutputFormat = ofNone);

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

(6) Activity 的

什么是活跃的?我认为没有必要。

(7)编码

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

例如,要这样写:
<?xml version="1.0" encoding="UTF-8" ?>

这是如果您保存文档并想要指定编码。如果有BOM,则OmniXML可以读取几乎所有的编码,以便进行读取。

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

您还可以检查我的SimpleStorage,它是OmniXML上的一组接口(interface),可简化很多操作。只需查看演示,看看我的意思。但不幸的是,它在拉撒路下不起作用。

10-05 23:03