В статье рассмотрим, как можно извлечь данные из XML-файла, используя примеры на языке Object Pascal с использованием компонентов Delphi для работы с XML. Основное внимание будет уделено чтению вложенных элементов внутри структуры, что особенно актуально, когда структура данных глубоко вложена в XML-документ.
Введение
При работе с XML-документами в Delphi часто возникает необходимость извлечения данных из сложных структур, где элементы могут быть вложены друг в друга. Для решения таких задач можно использовать интерфейсы IXMLDOMDocument и IXMLDOMNode, которые предоставляют мощные средства для парсинга и обработки XML.
Основная часть
Пример XML-файла
Давайте рассмотрим XML-файл, в котором есть вложенные структуры. Структура valres содержит элементы pairingip и pairingdevtype, которые пользователь не может прочитать в своем коде.
Пользователь пытался прочитать данные из XML, но не смог получить доступ к вложенным элементам pairingip и pairingdevtype. В его примере кода не хватает глубокого парсинга XML-структуры.
procedure TForm1.ParseResult(ResultString: string);
var
xml: IXMLDOMDocument;
node, innerNode: IXMLDOMNode;
begin
xml := CreateOleObject('Microsoft.XMLDOM') as IXMLDOMDocument;
xml.async := False;
xml.loadXML(ResultString);
if xml.parseError.errorCode <> 0 then
raise Exception.Create('XML Load error:' + xml.parseError.reason);
// Получение узла с параметрами
node := xml.selectSingleNode('//methodResponse/params/param/value/struct');
if Assigned(node) then
begin
// Перебор вложенных элементов
while node.hasChildNodes do
begin
innerNode := node.firstChild;
while Assigned(innerNode) do
begin
if innerNode.nodeName = 'name' and innerNode.text = 'pairingip' then
Edit1.Text := innerNode.nextSibling.firstChild.text; // Получение IP
if innerNode.nodeName = 'name' and innerNode.text = 'pairingdevtype' then
Edit2.Text := innerNode.nextSibling.firstChild.text; // Получение типа устройства
innerNode := innerNode.nextSibling;
end;
end;
end;
end;
Подтвержденный ответ
В коде выше представлен способ чтения значений pairingip и pairingdevtype, который предполагает, что эти элементы всегда находятся на одном уровне вложенности и имеют четкую структуру. Код использует методы selectSingleNode для поиска узлов с определенными именами и перебирает дочерние узлы для получения значений.
procedure TForm1.Button1Click(Sender: TObject);
var
XMLDoc: IXMLDOMDocument;
Node, SibNode: IXMLDOMNode;
begin
Memo2.Lines.Clear; // Очистка для тестового вывода
XMLDoc := CoDOMDocument.Create;
XMLDoc.LoadXML(Memo1.Lines.Text); // XML, добавленный в Memo1.Lines
// Нахождение узла member/name с текстом 'pairingip'
Node := XMLDoc.selectSingleNode('//member/name[text()="pairingip"]');
if Assigned(Node) then
begin
SibNode := Node.nextSibling.firstChild; // Переход к узлу 'value/string'
Memo2.Lines.Add('IP: ' + SibNode.Text);
end;
// Нахождение узла member/name с текстом 'pairingdevtype'
Node := XMLDoc.selectSingleNode('//member/name[text()="pairingdevtype"]');
if Assigned(Node) then
begin
SibNode := Node.nextSibling.firstChild; // Переход к узлу 'value/int'
Memo2.Lines.Add('DevType: ' + SibNode.Text);
end;
end;
Заключение
В данной статье мы рассмотрели, как с помощью компонентов Delphi и интерфейсов IXMLDOMDocument и IXMLDOMNode можно извлекать данные из XML-файлов, даже если они имеют сложную вложенную структуру. Приведенные примеры кода демонстрируют, как работать с элементами внутри структуры, что позволяет эффективно обрабатывать XML-документы в приложениях на Delphi.
В статье рассматривается процесс извлечения данных из XML-файла в среде Delphi, с акцентом на работу с вложенными элементами XML-структуры.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.