Тема: Парсинг XML
Показать сообщение отдельно
Старый 12.10.2011, 17:14   #1  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Доброго времени суток!
Помогите пожалуйста разобраться с парсингом 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;
Вот. Как то очень громоздко, а потому немного запутанно. И это ещё тут нет проверок на существование тегов. Добавим их и получится вообще монстр! Может всё-таки существует более элегантный подход?