我最近开始使用OmniXML,主要是因为它可以同时用于Delphi和Lazarus。
在XML方面,我自己是个初学者,我希望在这里我能学到一些东西,或者避免做我已经做过的坏事。
为此,我将使用另一个问题作为参考:使用XML保存和加载Treeview
在邦米的一个答案中,我认为他是在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
我看不出有什么办法把这样的财产设置为真假?
(7)编码
Delphi
FDOC.Encoding := 'UTF-8';OmniXML
再说一次,我没有这样的选择?
基本上,我想我想知道Delphi和OmniXML实现之间有什么区别。
我所做的改变是否正确?
我找不到的属性,如选项和编码,如何在OmniXML中实现这一点?
谢谢。
发布于 2013-09-03 13:16:54
(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之上的一组接口,可以大大简化它。查一下演示,看看我的意思。但不幸的是,这在拉撒路下行不通。
https://stackoverflow.com/questions/18591011
复制相似问题