AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 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;
Вот. Как то очень громоздко, а потому немного запутанно. И это ещё тут нет проверок на существование тегов. Добавим их и получится вообще монстр! Может всё-таки существует более элегантный подход?
Старый 12.10.2011, 18:25   #2  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Работа с xml реализована в кодеюните 6224 XML DOM Management (проверка существования нодов, получения их значений и атрибутов, дочерних нодов).
И да вложенность получается большая. Сам сейчас воюю с ними.


Код:
   //пример проверки 
  IF FindNode(XMLRootNode, 'Parameters', XMLNodeFound) THEN BEGIN
    XMLRootNode := XMLNodeFound;

    IF FindNode(XMLRootNode, 'PeriodStartingDate', XMLNodeFound) THEN BEGIN
      XMLRootNode := XMLNodeFound;

      // получение значения
      IF (STRLEN(XMLNodeFound.text) > 0) THEN
        curr:=XMLNodeFound.text              
    
    .....
    END 
  END;

Name DataType Subtype Length
xmlNodeFound Automation 'Microsoft XML, v6.0'.IXMLDOMNode
xmlRootNode Automation 'Microsoft XML, v6.0'.IXMLDOMNode
Старый 13.10.2011, 08:23   #3  
rmv is offline
rmv
Участник
 
481 / 11 (1) +
Регистрация: 15.02.2005
Цитата:
Сообщение от Predatore Посмотреть сообщение
Вот. Как то очень громоздко, а потому немного запутанно. И это ещё тут нет проверок на существование тегов. Добавим их и получится вообще монстр! Может всё-таки существует более элегантный подход?
Это ничего - все начинали с hello world .
Поставьте задачу залить в XML и из XML половину таблицу Навижна в структурированном виде (заказы продажи и покупки к примеру со всеми связанными справочниками) и откройте для себя мэппинг, генерацию и предвалидацию XSD схемами и множество других интересных вещей.
Старый 13.10.2011, 12:06   #4  
Predatore is offline
Predatore
Участник
 
163 / 17 (1) ++
Регистрация: 29.09.2010
Цитата:
Сообщение от InTacto Посмотреть сообщение
Работа с xml реализована в кодеюните 6224 XML DOM Management (проверка существования нодов, получения их значений и атрибутов, дочерних нодов).
И да вложенность получается большая. Сам сейчас воюю с ними.
Спасибо! Так гораздо лучше!
 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 11:18.