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

时间:2013-09-03 11:22:25

标签: xml delphi lazarus

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

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

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

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


(1)变量类型

的Delphi

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

OmniXML

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

(2)创建XML文档

的Delphi

FDOC := TXMLDocument.Create(nil);

OmniXML

FDOC := CreateXMLDoc; 

(3)释放XML文档

的Delphi

if Assigned(FDOC) then
    FDOC.Free;

OmniXML

我看不到释放文件的方法吗?


(4)属性

的Delphi

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)选项

的Delphi

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

OmniXML

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


(6)有效

的Delphi

FDOC.Active := true;

OmniXML

我认为无法将此类属性设置为True或False?


(7)编码

的Delphi

FDOC.Encoding := 'UTF-8';

OmniXML

我再次看不到这样的选择?


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

我做出的改变是否是正确的做法?

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

感谢。

1 个答案:

答案 0 :(得分: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" ?>

这是您保存文档并且要指定编码。对于阅读,OmniXML几乎可以读取BOM所在的任何编码。


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

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