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

6 xml delphi lazarus

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

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

为此,我将使用另一个问题作为参考:使用XML保存和加载Treeview

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


(1)变量类型

德尔福

TTreeToXML = Class
private
  FDOC: TXMLDocument;
  FRootNode: IXMLNode;
Run Code Online (Sandbox Code Playgroud)

OmniXML

TTreeToXML = Class
private
  FDOC: IXMLDocument;
  FRootNode: IXMLElement; 
Run Code Online (Sandbox Code Playgroud)

(2)创建XML文档

德尔福

FDOC := TXMLDocument.Create(nil);
Run Code Online (Sandbox Code Playgroud)

OmniXML

FDOC := CreateXMLDoc; 
Run Code Online (Sandbox Code Playgroud)

(3)释放XML文档

德尔福

if Assigned(FDOC) then
    FDOC.Free;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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; 
Run Code Online (Sandbox Code Playgroud)

(5)选项

德尔福

FDOC.Options := FDOC.Options + [doNodeAutoIndent];
Run Code Online (Sandbox Code Playgroud)

OmniXML

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


(6)积极

德尔福

FDOC.Active := true;
Run Code Online (Sandbox Code Playgroud)

OmniXML

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


(7)编码

德尔福

FDOC.Encoding := 'UTF-8';
Run Code Online (Sandbox Code Playgroud)

OmniXML

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


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

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

我找不到的属性如Options和Encoding,我将如何在OmniXML中实现它?

谢谢.

Run*_*ner 6

(1)变量类型

TTreeToXML = Class
private
  FDOC: IXMLDocument;
  FRootNode: IXMLNode; 
Run Code Online (Sandbox Code Playgroud)

(2)创建XML文档

好.

(3)释放XML文档

无需免费.它的界面基础.您可以像这样明确地释放它:

FDOC := nil;
Run Code Online (Sandbox Code Playgroud)

如果您没有任何其他参考.

(4)属性

可能还好.没有深入研究它.

(5)选项

保存XML文档时控制缩进.

procedure TXMLDocument.Save(const FileName: string; const OutputFormat: TOutputFormat = ofNone);
Run Code Online (Sandbox Code Playgroud)

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

(6)积极

什么是活跃的?我觉得没必要.

(7)编码

使用:

function CreateProcessingInstruction(const Target, Data: XmlString): IXMLProcessingInstruction;
Run Code Online (Sandbox Code Playgroud)

像这样写它:

<?xml version="1.0" encoding="UTF-8" ?>
Run Code Online (Sandbox Code Playgroud)

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


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

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