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

前端之家收集整理的这篇文章主要介绍了如何在OmniXML和Delphi自己的XML库之间转换代码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近开始使用Omni XML主要是因为它可以用于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实现之间有什么区别.

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

我找不到的属性如Options和Encoding,我将如何在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)积极

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

(7)编码

使用:

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

像这样写它:

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

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

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

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

猜你在找的Delphi相关文章