2013-09-03 8 views
6

Ich habe OmniXML vor kurzem verwendet, weil es sowohl für Delphi als auch für Lazarus verwendet werden kann.Wie konvertiere ich Code zwischen OmniXML und Delphi eigenen XML-Bibliothek?

Ich selbst bin ein Anfänger, wenn es um XML geht, und hier hoffe ich, dass ich einige Dinge lernen oder vermeiden kann, irgendwelche schlechten Dinge zu tun, die ich vielleicht schon mache.

Dafür wird mir eine andere Frage, die ich als Referenz verwenden muß: Saving and Loading Treeview using XML

In eines der Antworten von bummi, ich glaube, er Standard-XML in Delphi verwendet, wo ich OmniXML in Lazarus verwenden, so Der Code, den er in seiner Antwort postete, würde nicht kompilieren. Ich habe es funktioniert jetzt, nachdem ein Teil des Codes zu ändern, aber ich muss wissen, ob die folgenden richtig ist:


(1) Variablentypen

Delphi

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

OmniXML

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

(2) Erstellen der XML-Dokument

Delphi

FDOC := TXMLDocument.Create(nil); 

OmniXML

FDOC := CreateXMLDoc; 

(3) Befreit das XML-Dokument

Delphi

if Assigned(FDOC) then 
    FDOC.Free; 

OmniXML

Ich kann nicht sehen, wie man das Dokument zu befreien?


(4) Attributes

Delphi

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) Optionen

Delphi

FDOC.Options := FDOC.Options + [doNodeAutoIndent]; 

OmniXML

Das Dokument mit Einrückungen automatisch gespeichert wird, kann ich keine Optionen finden?


(6) Aktive

Delphi

FDOC.Active := true; 

OmniXML

Ich sehe keine Möglichkeit, eine solche Eigenschaft der Einstellung auf Wahr oder Falsch?


(7) Encoding

Delphi

FDOC.Encoding := 'UTF-8'; 

OmniXML

Wieder sehe ich keine solche Option?


Also im Grunde ich denke, ich würde gerne wissen, was sind die Unterschiede zwischen dem Delphi XML und OmniXML Implementierungen.

Sind die Änderungen die richtige Vorgehensweise oder nicht?

Die Eigenschaften, die ich nicht finden kann, wie Optionen und Codierung, wie würde ich dies in OmniXML implementieren?

Danke.

+0

Ich würde nicht "MSXML" Standard nennen, noch ist es Delphi's Own. Es ist Windows/Microsofts eigene API. Wrapper für die Windows-MS-XML-DLLs sind in der Box enthalten, aber es wäre klar, nur "Konvertieren in MSXML-API" zu sagen. –

+0

@WarrenP Ich sehe Ihren Punkt, aber ich denke, ich habe es als Delphi's bezeichnet, einfach weil die Einheiten mit Delphi als Standard kommen und in Lazarus nicht. –

Antwort

6

(1) Variablentypen

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

(2) Erstellen von XML-Dokument

OK.

(3) Befreien des XML-Dokument

Keine Notwendigkeit zu befreien. Seine Schnittstelle basiert. Sie können es explizit wie folgt freigeben:

FDOC := nil; 

vorausgesetzt, Sie haben keine anderen Verweise darauf.

(4) Attribute

Wahrscheinlich OK. Ich habe nicht viel nachgesehen.

(5) Optionen

Sie steuern Einzug, wenn Sie XML-Dokument speichern.

procedure TXMLDocument.Save(const FileName: string; const OutputFormat: TOutputFormat = ofNone); 

Dies ist, was das OutputFormat ist. Überprüfen Sie auch die "PreserveWhiteSpace" -Eigenschaft beim Laden der XML aus Datei oder Stream.

(6) Aktive

Was ist anwesend? Ich sehe keine Notwendigkeit dafür.

(7) Encoding

Verwendung:

function CreateProcessingInstruction(const Target, Data: XmlString): IXMLProcessingInstruction; 

Um es so zum Beispiel zu schreiben:

<?xml version="1.0" encoding="UTF-8" ?> 

Dies ist, wenn Sie das Dokument speichern und Sie festlegen möchten, die Codierung. Zum Lesen kann OmniXML fast jede Kodierung lesen, sofern die BOM vorhanden ist.


Wie auch immer OmniXML ist sehr ähnlich zu TXMLDocument. Änderungen sind hauptsächlich in der Programmierschnittstelle und OmniXML ist kompatibel mit MSXML.

Sie können auch meine SimpleStorage, die eine Reihe von Schnittstellen auf OmniXML ist, die es eine Menge vereinfachen. Schau dir die Demos an und schau, was ich meine. Aber unter Lazarus funktioniert es leider nicht.

+0

gut auf Sie für die Beantwortung von 7 Fragen in einer "Frage". –

+0

@ Ӎσᶎ Obwohl es wie 7 Fragen in einem scheint, fühlte ich, dass es besser war, dann 7 einzelne Fragen zu stellen, die jede andere Frage effektiv auf die Liste verschieben würden. –

+1

Ich stimme Blobby zu, die Fragen sind zum selben Thema und gruppiert. – Runner