6

我最近开始使用 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 的方法吗?


(7) 编码

德尔福

FDOC.Encoding := 'UTF-8';

OmniXML

我再次看到没有这样的选择?


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

我所做的更改是否正确?

我找不到诸如选项和编码之类的属性,我将如何在 OmniXML 中实现它?

谢谢。

4

1 回答 1

6

(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) 主动

什么是主动?我认为没有必要。

(7) 编码

利用:

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

例如这样写:

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

这是如果您保存文档并且要指定编码。对于读取,只要有 BOM,OmniXML 几乎可以读取任何编码。


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

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

于 2013-09-03T13:16:54.360 回答