簡體   English   中英

如何在OmniXML和Delphi自己的XML庫之間轉換代碼?

[英]How do I convert code between OmniXML and Delphi's own XML library?

我最近開始使用OmniXML主要是因為它可以用於Delphi和Lazarus。

我自己是XML的初學者,這是我希望我能學到一些東西或避免做任何我可能已經做過的壞事的地方。

為此,我將使用另一個問題作為參考: 使用XML保存和加載Treeview

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下無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM