В статье посвящённой разбору XML документов при помощи TXMLDocument уже упоминалось о том, что данный компонент способен не только разбирать, но и создавать XML документы. Рассмотрим процесс создания XML более подробно.
Постановка задачи
В качестве примера возьмём XML документ с более сложной структурой, чем был приведён в вышеупомянутой статье.
1 2 3 4 5 6 7 8 9 10 |
Example Begin Body Item1 Item2 Item3 End |
При этом положим, что количество дочерних узлов у узла array неограниченно, а атрибуты attr и tag узлов node2 и node4 соответственно изначально имеют числовой формат.
Реализация
Попробуем сформировать подобный XML документ в Delphi.
Для создания узлов XML служит метод AddChild. В данном случае, лучше всего подходит его перегрузка, которая принимает только имя узла.
Вначале создадим корневой узел.
1 2 3 4 5 6 7 |
var RootNode: IXMLNode; . . . begin . . . XMLDocument.Active:=true; RootNode := XMLDocument.AddChild('main'); |
Так как метод AddChild возвращает элемент IXMLNode, заполнять значения во вновь создаваемых узлах можно сразу же в процессе создания, как показано ниже.
1 |
RootNode.AddChild('node1').Text:=node1Edit.Text; |
К сожалению, этот способ не подходит, если узел имеет атрибуты. В этом случае потребуется вспомогательная переменная.
1 2 3 4 5 |
var ChildNode: IXMLNode; begin . . . ChildNode := RootNode.AddChild('node2'); |
Или оператор with.
1 2 3 4 5 |
with RootNode.AddChild('node2') do begin Text := node2Edit.Text; Attributes['attr'] := attrUpDown.Position; end; |
В результате будет полностью сформирован узел node2.
Узел node3 имеет значительно более сложную структуру. Помимо собственного значения, он содержит дочерний узел, который в свою очередь включает ещё ряд однотипных узлов (по сути, является массивом).
Однако, несмотря на громоздкую «конструкцию» узел node3 можно легко сформировать, используя вложенный оператор with.
1 2 3 4 5 6 7 |
with RootNode.AddChild('node3') do begin Text := node3Edit.Text; with AddChild('array') do for i := 0 to Memo.Lines.Count - 1 do AddChild('item').Text := Memo.Lines[i]; end; |
Подобным образом можно создавать узлы любой степени вложенности, а также заполнять их значения и атрибуты.
Узел node4 создаём полностью по аналогии с узлом node2.
1 2 3 4 5 6 |
with RootNode.AddChild('node4') do begin Text := node4Edit.Text; Attributes['str']:=strEdit.Text; Attributes['tag'] := tagUpDown.Position; end; |
Теперь, когда XML документ полностью сформирован, остаётся только сохранить его в файл.
1 |
XMLDocument.SaveToFile('finished_sample.xml'); |
Ниже показан скриншот программы, которая формирует данный XML документ.
Результат её работы.
1 2 3 4 5 6 7 8 9 10 11 12 |
Самый 1й узел Следующий узел Самый сложный узел во всём XML документе Строка 1 Строка 2 Строка 3 Добавим 4ю строку Пусть будет и 5я 4й узел XML документа |
Очевидно, что по своей сложности создание XML документа при помощи компонента TXMLDocument практически не отличается от процесса разбора. Также необходимый функционал в обоих случаях достаточно удобен. Поэтому, данный компонент прекрасно подходит для решения почти любых задач связанных с обработкой XML.
Добавить комментарий