2013-09-03 8 views
6

Niedawno zacząłem używać OmniXML przede wszystkim dlatego, że można go używać zarówno w Delphi, jak iw Lazarusie.Jak przekonwertować kod między OmniXML i biblioteką XML Delphi?

Sam jestem początkujący, jeśli chodzi o XML, i to jest miejsce, w którym mam nadzieję, że mogę się czegoś nauczyć lub unikać robienia złych rzeczy, które już mogę robić.

Do tego mam zamiar użyć innego Mam pytanie jako punkt odniesienia: Saving and Loading Treeview using XML

w jednej z odpowiedzi przez bummi, myślę, że jest on za pomocą standardowego języka XML w Delphi gdzie używam OmniXML w Łazarza, więc kod, który zamieścił w swojej odpowiedzi, nie skompilowałby się. Mam to działa teraz po zmianie niektórych kodu, ale muszę wiedzieć, czy następuje to poprawne:


(1) Typy zmiennych

Delphi

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

OmniXML

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

(2) Tworzenie dokumentu XML

Delphi

FDOC := TXMLDocument.Create(nil); 

OmniXML

FDOC := CreateXMLDoc; 

(3) Uwolnienie dokumentu XML

Delphi

if Assigned(FDOC) then 
    FDOC.Free; 

OmniXML

nie widzę sposobu na uwolnienie dokumentu?


(4) Cechy

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

Delphi

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

OmniXML

dokument jest automatycznie zapisywany z myślnikiem, nie mogę znaleźć żadnych opcji?


(6) Aktywny

Delphi

FDOC.Active := true; 

OmniXML

widzę żadnej możliwości ustawiania taką właściwość, aby Prawda czy fałsz?


(7) Kodowanie

Delphi

FDOC.Encoding := 'UTF-8'; 

OmniXML

Ponownie patrz takiej możliwości?


Więc w zasadzie myślę, że chciałbym wiedzieć, jakie są różnice między XML Delphi i wdrożeń OmniXML.

Czy zmiany dokonałem we właściwy sposób, czy nie?

Właściwości, których nie mogę znaleźć, takie jak Opcje i Kodowanie, w jaki sposób mogę to zaimplementować w OmniXML?

Dzięki.

+0

Nie nazwałbym standardu "MSXML", ani nie jest to własność Delphi. To własne API Window/Microsoft. Opakowania dla bibliotek DLL XML MS Windows są zawarte w pudełku, ale byłoby jasne, że wystarczy powiedzieć "przekonwertuj na interfejs MSXML API". –

+0

@WarrenP Widzę twoją sprawę, ale myślę, że odniosłem się do niej jako do Delphi po prostu dlatego, że jednostki pochodzą z Delphi w standardzie, a w Łazarzu nie. –

Odpowiedz

6

(1) Typy zmiennych

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

(2) Tworzenie dokumentu XML

OK.

(3) Zwalnianie dokumentu XML

Nie ma potrzeby, aby uwolnić. Jego interfejs oparty. Możesz jednoznacznie zwolnić:

FDOC := nil; 

pod warunkiem, że nie masz żadnych innych odniesień do niego.

(4) Atrybuty

Prawdopodobnie OK. Nie patrzyłem na to za dużo.

(5) Opcje

można sterować wcięcia po zapisaniu dokumentu XML.

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

Do tego służy OutputFormat. Sprawdź również właściwość "PreserveWhiteSpace" podczas ładowania pliku XML z pliku lub strumienia.

(6) Aktywny

Co jest aktywny? Nie widzę potrzeby.

(7) Kodowanie

Zastosowanie:

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

Aby napisać to tak na przykład:

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

To jeśli zapiszesz dokument i chcesz określić kodowanie. Do czytania OmniXML może odczytać prawie każde kodowanie pod warunkiem, że istnieje zestawienie komponentów.


W każdym razie OmniXML jest bardzo podobny do TXMLDocument. Zmiany są głównie w interfejsie programistów, a OmniXML jest kompatybilny z MSXML.

Możesz również sprawdzić mój SimpleStorage, który jest zbiorem interfejsów na OmniXML, które upraszczają go dużo. Sprawdź dema i zobacz, co mam na myśli. Ale nie działa to niestety pod Łazarza.

+0

dobrze ci odpowiada za odpowiedzenie na 7 pytań w jednym "pytaniu". –

+0

@ Ӎσᶎ Chociaż może się wydawać, że 7 pytań w jednym, czułem, że było lepiej niż zrobienie 7 pojedynczych pytań, które skutecznie poruszyłyby każde inne pytanie na liście. –

+1

Zgadzam się z Blobby, pytania są na ten sam temat i pogrupowane. – Runner

Powiązane problemy