Как преобразовать код между 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, которые значительно упрощают его. Просто проверь демо и пойми, что я имею в виду. Но это не работает при Лазаре, к сожалению.