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.
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". –
@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. –