[英]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.