Доброго времени суток!
Помогите пожалуйста разобраться с парсингом xml документа. Я нашёл по этой теме такую ссылку
http://naviart.ru/read-xml-from-nav но что-то не получается у меня сделать как там описано. Возможно из-за непонимания неких основ XML. Как мне кажется getAttributeNode это чтение именно атрибута тега, если так, то в моё xml документе не используются атрибуты.
По сути, я сделал более менее работающее решение, но мне кажется, что это можно сделать правильней, а соответственно и лучше. Ну а если лучше не получится, может кому пригодиться
И так, на входе у меня xml с вложенной структурой, в тегах не используются параметры. Выглядит этот xml примерно так:
Код:
<?xml version="1.0" standalone="no" ?>
<Exports>
<Parameters>
<PeriodStartingDate>11.10.2011</PeriodStartingDate>
<PeriodEndingDate>11.10.2011</PeriodEndingDate>
</Parameters>
<Contragents>
<Contragent>
<ContragentNo>123456789</ContragentNo>
<ContragentType>0</ContragentType>
</Contragent>
<Contragent>
<ContragentNo>987654321</ContragentNo>
<ContragentType>1</ContragentType>
</Contragent>
</Contragents>
</Exports>
Для примера достаточно.
Распарсиваю я его следующим образом:
Код:
XMLNodeList1 := XMLDOMDoc.childNodes();
XMLDOMElement1 := XMLNodeList1.item(1);
IF XMLDOMElement1.nodeName = 'Exports' THEN BEGIN
XMLNodeList2 := XMLDOMElement1.getElementsByTagName('Parameters');
XMLDOMElement2 := XMLNodeList2.item (0);
XMLNodeList3 := XMLDOMElement2.getElementsByTagName('PeriodStartingDate');
XMLDOMElement3 := XMLNodeList3.item (0);
MESSAGE (XMLDOMElement3.text);
XMLNodeList3 := XMLDOMElement2.getElementsByTagName('PeriodEndingDate');
XMLDOMElement3 := XMLNodeList3.item (0);
MESSAGE (XMLDOMElement3.text);
XMLNodeList2 := XMLDOMElement1.getElementsByTagName('Contragents');
XMLDOMElement2 := XMLNodeList2.item (0);
XMLNodeList3 := XMLDOMElement2.getElementsByTagName('Contragent');
FOR i := 0 TO XMLNodeList3.length-1 DO BEGIN
XMLDOMElement3 := XMLNodeList3.item (i);
XMLNodeList4 := XMLDOMElement3.getElementsByTagName('ContragentNo');
XMLDOMElement4 := XMLNodeList4.item (0);
MESSAGE (XMLDOMElement4.text);
XMLNodeList4 := XMLDOMElement3.getElementsByTagName('ContragentType');
XMLDOMElement4 := XMLNodeList4.item (0);
MESSAGE (XMLDOMElement4.text);
END;
END;
Вот. Как то очень громоздко, а потому немного запутанно. И это ещё тут нет проверок на существование тегов. Добавим их и получится вообще монстр! Может всё-таки существует более элегантный подход?