TXMLDocument – стандартный компонент для работы с XML, который входит в состав как VCL, так и FireMonkey. Данный компонент позволяет разбирать уже готовые XML файлы и формировать новые. При этом он выполняет обе задачи достаточно просто и эффективно.
Постановка задачи
Рассмотрим разбор XML на примере документа следующей структуры:
1 2 3 4 5 6 |
TestNode 1234567890 TestItem1 TestItem2 TestItem3 |
В документе имеется корневой элемент test, два обычных узла node1 (имеет атрибут attr) и node2, а также узел array, представляющий собой, по сути, массив некоторых данных.
Допустим, узел node1 и его атрибут необходимо интерпретировать как текст, node2, как числовое значение, а содержимое узла array, как набор строковых данных.
Реализация
Вначале необходимо загрузить XML документ из файла.
1 2 |
XMLDocument.LoadFromFile('test.xml'); XMLDocument.Active := true; |
Далее получаем корневой элемент:
1 2 3 4 5 6 |
var RootNode: IXMLNode; . . . begin . . . RootNode := XMLDocument.DocumentElement; |
После этого можно приступать непосредственно к самому процессу разбора (парсинга).
Для доступа к дочерним узлам используется свойство ChildNodes, которое возвращает массив элементов IXMLNodeList. Для получения конкретного узла (элемента IXMLNode) нужно обратиться к нему по имени или номеру (нумерация начинается с нуля).
Содержимое узла доступно с помощью свойства Text в виде строки.
Доступ к атрибутам конкретного узла осуществляется аналогичным образом при помощи свойства Attributes, которое возвращает массив типа OleVariant содержащий непосредственно сами значения атрибутов.
Извлечём значение первого узла и его атрибута.
1 2 |
node1Edit.Text := RootNode.ChildNodes['node1'].Text; attrLabel.Caption := RootNode.ChildNodes['node1'].Attributes['attr']; |
Значение второго узла извлекается аналогично, но с учётом того, что его требуется интерпретировать как число.
1 |
UpDown.Position := StrToInt(RootNode.ChildNodes['node2'].Text); |
Для обхода массива потребуется цикл с обращением к каждому элементу по его номеру.
1 2 3 4 5 6 7 |
var i: Integer: . . . begin . . . for i := 0 to RootNode.ChildNodes['array'].ChildNodes.Count - 1 do Memo.Lines.Add(RootNode.ChildNodes['array'].ChildNodes[i].Text); |
В результате всех вышеописанных действий данные из XML документа будут загружены и отображены в программе.
Несмотря на простоту, подобным образом можно выполнить разбор (парсинг) XML документов практически любой структуры и, соответственно, сложности.
Особенности работы с TXMLDocument в FireMonkey
В отличие от VCL, FireMonkey кроссплатформенная библиотека. Поэтому при работе с TXMLDocument в проектах FireMonkey требуется указывать программу, которая будет заниматься непосредственным разбором XML разметки в свойстве DOMVendor.
Доступны три варианта. MSXML для Windows (используется в этой операционной системе по умолчанию) и два кроссплатформенных Omni XML ADOM XML v4.
Если приложение предназначено для использования не только в Windows или вообще не предназначено для этой операционной системы, нужно обязательно учитывать данное обстоятельство и правильно выбирать программу для разбора XML разметки.
Добавить комментарий