Как преобразовать код между OmniXML и собственной библиотекой XML Delphi?

недавно я начал использовать OmniXML в первую очередь потому, что его можно использовать как для Delphi, так и для Lazarus.

Я сам новичок, когда дело доходит до XML, и именно здесь я надеюсь, что смогу узнать некоторые вещи или избежать каких-либо плохих вещей, которые я, возможно, уже делаю.

для этого я собираюсь использовать другой вопрос у меня есть ссылка: сохранение и загрузка Treeview с помощью XML

в одном из ответов bummi, я думаю, что он использует стандартный XML в Delphi, где я использую OmniXML в Lazarus, поэтому код, который он опубликовал в своем ответе, не будет компилироваться. Теперь он работает после изменения некоторого кода, но мне нужно знать, правильно ли следующее:


(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?

спасибо.

1 ответов


(1) Типы Переменных

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

(2) Создание XML-документа

OK.

(3) Освобождение XML-документа

нет необходимости освобождать. Его интерфейс. Вы можете явно освободить его следующим образом:

FDOC := nil;

при условии, что у вас нет других ссылок на него.

(4) атрибуты

наверное, это нормально. Не смотрел в него, чтобы много.

(5) Варианты

вы управляете отступом при сохранении XML-документа.

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

это то, для чего предназначен OutputFormat. Также проверьте свойство "PreserveWhiteSpace" при загрузке XML из файла или потока.

(6) активный

что активно? Я не вижу в этом необходимости.

(7) кодирование

использование:

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

написать это так для пример:

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

Это если вы сохраняете документ и хотите указать кодировку. Для чтения OmniXML можно прочитать практически любую кодировку при условии, что BOM есть.


в любом случае OmniXML очень похож на TXMLDocument. Изменения в основном происходят в интерфейсе программистов, а OmniXML совместим с MSXML.

вы также можете проверить мои SimpleStorage который представляет собой набор интерфейсов поверх OmniXML, которые значительно упрощают его. Просто проверь демо и пойми, что я имею в виду. Но это не работает при Лазаре, к сожалению.