2013-09-03 45 views
6

Gần đây tôi đã bắt đầu sử dụng OmniXML chủ yếu vì nó có thể được sử dụng cho cả Delphi và Lazarus.Làm cách nào để chuyển đổi mã giữa OmniXML và thư viện XML của Delphi?

Bản thân tôi là một người mới bắt đầu khi nói đến XML, và đây là nơi tôi hy vọng tôi có thể học một số điều hoặc tránh làm bất kỳ điều xấu tôi có thể đã làm.

Đối với điều này tôi sẽ sử dụng một câu hỏi tôi có là một tài liệu tham khảo: Saving and Loading Treeview using XML

Trong một trong những câu trả lời bằng bummi, tôi nghĩ rằng ông đang sử dụng XML tiêu chuẩn trong Delphi nơi tôi đang sử dụng OmniXML trong Lazarus, vì vậy mã anh ta đăng trong câu trả lời của anh ta sẽ không biên dịch. Tôi có nó làm việc bây giờ sau khi thay đổi một số mã nhưng tôi cần phải biết nếu những điều sau đây là đúng:


(1) Biến loại

Delphi

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

OmniXML

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

(2) Tạo tài liệu XML

Delphi

FDOC := TXMLDocument.Create(nil); 

OmniXML

FDOC := CreateXMLDoc; 

(3) Giải phóng các tài liệu XML

Delphi

if Assigned(FDOC) then 
    FDOC.Free; 

OmniXML

Tôi không thể nhìn thấy một cách để giải thoát những tài liệu?


(4) Các thuộc tính

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) Tùy chọn

Delphi

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

OmniXML

Các tài liệu được lưu với indents tự động, tôi không thể tìm thấy bất kỳ tùy chọn?


(6) kích hoạt

Delphi

FDOC.Active := true; 

OmniXML

tôi thấy không có cách nào thiết lập một tài sản đó là True hoặc False?


(7) Encoding

Delphi

FDOC.Encoding := 'UTF-8'; 

OmniXML

Một lần nữa tôi thấy không có lựa chọn như vậy?


Vì vậy, về cơ bản tôi đoán tôi muốn biết sự khác biệt giữa triển khai XML Delphi và OmniXML là gì.

Có phải những thay đổi tôi đã thực hiện đúng cách để thực hiện hay không?

Các thuộc tính tôi không thể tìm thấy, chẳng hạn như Tùy chọn và mã hóa, tôi sẽ triển khai tính năng này như thế nào trong OmniXML?

Cảm ơn.

+0

Tôi sẽ không gọi tiêu chuẩn "MSXML", cũng không phải là của riêng Delphi. Đó là API của Window/Microsoft. Trình bao bọc cho các tệp DLL Windows MS XML được bao gồm trong hộp, nhưng rõ ràng là chỉ cần nói "chuyển đổi thành API MSXML". –

+0

@WarrenP Tôi thấy quan điểm của bạn, nhưng tôi nghĩ rằng tôi gọi nó là Delphi của đơn giản chỉ vì các đơn vị đi kèm với Delphi như là tiêu chuẩn, và trong Lazarus họ không. –

Trả lời

6

(1) Biến loại

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

(2) Tạo tài liệu XML

OK.

(3) Giải phóng các tài liệu XML

Không cần phải giải phóng. Giao diện của nó dựa trên. Bạn có thể giải phóng một cách rõ ràng như sau:

FDOC := nil; 

miễn là bạn không có bất kỳ tham chiếu nào khác.

(4) Các thuộc tính

lẽ OK. Đã không nhìn vào nó nhiều.

(5) Tùy chọn

Bạn kiểm soát thụt đầu dòng khi bạn lưu tài liệu XML.

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

Đây là những gì OutputFormat dành cho. Ngoài ra, hãy kiểm tra thuộc tính "PreserveWhiteSpace" khi tải XML từ tệp hoặc luồng.

(6) kích hoạt

là gì tích cực? Tôi thấy không cần thiết.

(7) Encoding

Sử dụng:

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

Để viết nó như thế này ví dụ:

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

này là nếu bạn lưu tài liệu và bạn muốn chỉ định mã hóa. Để đọc OmniXML có thể đọc hầu như mọi mã hóa được cung cấp cho BOM.


Dù sao OmniXML rất giống với TXMLDocument. Thay đổi chủ yếu là trong giao diện lập trình và OmniXML tương thích với MSXML.

Bạn cũng có thể kiểm tra SimpleStorage của tôi là một tập hợp các giao diện ở trên cùng của OmniXML giúp đơn giản hóa nó thành RẤT NHIỀU. Chỉ cần kiểm tra các bản demo và xem những gì tôi có ý nghĩa. Nhưng nó không hoạt động dưới Lazarus.

+0

tốt cho bạn để trả lời 7 câu hỏi trong một "câu hỏi". –

+0

@ Ӎσᶎ mặc dù nó có vẻ như 7 câu hỏi trong một, tôi cảm thấy nó là tốt hơn sau đó làm cho 7 câu hỏi duy nhất mà có hiệu quả sẽ di chuyển mọi câu hỏi khác xuống danh sách. –

+1

Tôi đồng ý với Blobby, các câu hỏi có cùng chủ đề và được nhóm lại. – Runner