- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我最近开始使用 OmniXML,主要是因为它可用于 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?
(七)编码
德尔福
FDOC.Encoding := 'UTF-8';
OmniXML
我又没看到这样的选项?
所以基本上我想我想知道 Delphi XML 和 OmniXML 实现之间的区别是什么。
我所做的更改是否正确?
我找不到选项和编码等属性,我该如何在 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) 活跃
什么是事件?我认为没有必要。
(七)编码
使用:
function CreateProcessingInstruction(const Target, Data: XmlString): IXMLProcessingInstruction;
比如这样写:
<?xml version="1.0" encoding="UTF-8" ?>
如果您保存文档并且您想要指定编码。如果 BOM 存在,OmniXML 几乎可以读取任何编码。
无论如何,OmniXML 与 TXMLDocument 非常相似。更改主要在程序员界面中,并且 OmniXML 与 MSXML 兼容。
你也可以查看我的SimpleStorage这是 OmniXML 之上的一组接口(interface),大大简化了它。只需查看演示,看看我的意思。但不幸的是,它在 Lazarus 下不起作用。
关于xml - 如何在 OmniXML 和 Delphi 自己的 XML 库之间转换代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18591011/
我是一名优秀的程序员,十分优秀!