2013-09-03 12 views
6

最近DelphiとLazarusの両方で使用できるため、OmniXMLの使用を開始しました。OmniXMLとDelphi独自のXMLライブラリ間でコードを変換するにはどうすればよいですか?

私自身はXMLについては初心者ですが、これは私がいくつかのことを学び、すでにやっているかもしれない悪いことを避けることを望みます。私はリファレンスとして持っている別の質問を使用するつもりです。このため

bummiによって答えの一つでSaving and Loading Treeview using XML

を、私は彼が、私はラザロにOmniXMLを使用していますDelphiで標準XMLを使用していると思います彼の答えに投稿したコードはコンパイルされませんでした。私はそれがコードの一部を変更した後、今働いていますが、私は以下のが正しいかどうかを知る必要があります。


(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の実装の違いを知りたいと思います。

変更が正しいかどうかを確認しましたか?

オプションやエンコーディングなどのプロパティが見つからない場合は、OmniXMLでどのように実装しますか?

ありがとうございました。

+0

私は「MSXML」標準とは呼ばず、Delphi独自のものでもありません。それはウィンドウズ/マイクロソフト自身のAPIです。 Windows MS XML DLLのラッパーはこのボックスに含まれていますが、「MSXML APIに変換する」と言うだけでは間違いありません。 –

+0

@WarrenP私はあなたの要点を見ていますが、ユニットにはデルファイが標準装備されているため、Delphiのものとしてそれを参照していると思います。 –

答えて

6

(1)変数の型

TTreeToXML = Class 
private 
    FDOC: IXMLDocument; 
    FRootNode: IXMLNode; 

(2)XML文書に

OKを作成します。

(3)XMLドキュメント

に解放する必要はありませんを解放。そのインターフェイスは、ベース。このように明示的に解放することができます。

FDOC := nil; 

ただし、他の参照はありません。

(4)

はおそらくOK属性。あまり見ないでください。

(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と互換性があります。

また、OmniXMLの上にある一連のインターフェイスである私のSimpleStorageをチェックして、それを簡単にすることもできます。デモをチェックして、私が何を意味するかを見てください。しかし、残念なことにLazarusではうまくいきません。

+0

1つの「質問」で7つの質問に答えることができます。 –

+0

@σσone 1つの質問が7つのように見えるかもしれませんが、私はそれがリストの下に他のすべての質問を効果的に移動する7つの単一の質問を作成する方が良いと感じました。 –

+1

私はBlobbyに同意します。質問は同じトピックであり、グループ化されています。 – Runner

関連する問題