首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在OmniXML和Delphi库之间转换代码?

如何在OmniXML和Delphi库之间转换代码?
EN

Stack Overflow用户
提问于 2013-09-03 11:22:24
回答 1查看 1.1K关注 0票数 6

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

在XML方面,我自己是个初学者,我希望在这里我能学到一些东西,或者避免做我已经做过的坏事。

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

邦米的一个答案中,我认为他是在Delphi中使用标准XML,而我在Lazarus中使用的是OmniXML,所以他在答案中发布的代码不会编译。在修改了一些代码之后,我现在已经开始工作了,但是我需要知道以下内容是否正确:

(1)变量类型

Delphi

代码语言:javascript
复制
TTreeToXML = Class
private
  FDOC: TXMLDocument;
  FRootNode: IXMLNode;

OmniXML

代码语言:javascript
复制
TTreeToXML = Class
private
  FDOC: IXMLDocument;
  FRootNode: IXMLElement; 

(2)创建XML文档

Delphi

代码语言:javascript
复制
FDOC := TXMLDocument.Create(nil);

OmniXML

代码语言:javascript
复制
FDOC := CreateXMLDoc; 

(3)释放XML文档

Delphi

代码语言:javascript
复制
if Assigned(FDOC) then
    FDOC.Free;

OmniXML

我看不出有什么办法释放这份文件?

(4)属性

Delphi

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
FDOC.Options := FDOC.Options + [doNodeAutoIndent];

OmniXML

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

(6)活性

Delphi

代码语言:javascript
复制
FDOC.Active := true;

OmniXML

我看不出有什么办法把这样的财产设置为真假?

(7)编码

Delphi

代码语言:javascript
复制
FDOC.Encoding := 'UTF-8';

OmniXML

再说一次,我没有这样的选择?

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

我所做的改变是否正确?

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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-03 13:16:54

(1)变量类型

代码语言:javascript
复制
TTreeToXML = Class
private
  FDOC: IXMLDocument;
  FRootNode: IXMLNode; 

(2)创建XML文档

好的。

(3)释放XML文档

不需要自由。基于它的接口。您可以这样显式地释放它:

代码语言:javascript
复制
FDOC := nil;

如果你没有其他参考资料的话。

(4)属性

可能没问题。没仔细调查过。

(5)选项

保存XML文档时控制缩进。

代码语言:javascript
复制
procedure TXMLDocument.Save(const FileName: string; const OutputFormat: TOutputFormat = ofNone);

这就是OutputFormat的作用所在。在从文件或流加载XML时,还要检查"PreserveWhiteSpace“属性。

(6)活性

什么是主动的?我觉得没必要这么做。

(7)编码

使用:

代码语言:javascript
复制
function CreateProcessingInstruction(const Target, Data: XmlString): IXMLProcessingInstruction;

例如,要像这样写:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8" ?>

如果保存文档并指定编码,则为此。对于读取,OmniXML几乎可以读取任何编码,前提是BOM在那里。

总之,OmniXML非常类似于TXMLDocument。更改主要在程序员接口中,OmniXML与MSXML兼容。

您还可以检查我的SimpleStorage,它是OmniXML之上的一组接口,可以大大简化它。查一下演示,看看我的意思。但不幸的是,这在拉撒路下行不通。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18591011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档