我自己是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中实现它?
谢谢.
解决方法
- 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下无效.