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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.08.2012, 16:37   #1  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
XML import . Axapta 3.0
Здраствуйте,

Первые шаги с импортом XML ... :-) . Никак немогу найти в чем проблема, работая с XMLDocument классой . Проблема в том , что заказ имеет cart, в нем несколько товаров <product> .

XML здесь - http://ut.impegno.lt/lt/shop/importer/export-orders

Мой исходник :

X++:
   XMLDocument   doc;
   XMLNode       rootNode;
   XMLNode       delivNode, custNode, compNode, ordLineNode, prodLNode, cartNode, prodNodes;
   XMLNodeList   salesLines, orderLines, prodNode;
   XMLNodeListIterator it;
   XMLParseError xmlError;

   SalesId    cOrd;
   ItemId     cItm;
   InventQty  nQty;
   SalesPrice nPrc;
   ConfigId   cCnf;
   ContManage aCart;

   Str        cVeniPak, cNote, cSkuVar;
   Str        cUserName, cUserLName, cUserPhone, cUserEMail, cUserCity, cUserAdr, cUserHNum;
   Str        cCompName, cCompCode, cCompVat, cCompPhone, cCompFax, cCompAdr;
   Real       nDelivPrice;
   int        ord, u, crt, lCompany, n1, n2, zz;

   doc = new XMLDocument();
   doc.async( false );
   doc.load( "c:\\\\WuTemp\\export-orders.xml" );
   xmlError = doc.parseError();

   if ( xmlError && xmlError.errorCode() != 0 )
      throw error( strfmt( "XML failo klaida : %1", xmlError.reason() ) );

   rootNode   = doc.documentElement();
   orderLines = rootNode.selectNodes( "//order" );
   for ( ord = 0; ord < orderLines.length(); ord ++ )
   {
      aCart       = new ContManage();
      ordLineNode = orderLines.item( ord );
      cOrd        = ordLineNode.selectSingleNode("id").text();
      nDelivPrice = str2num( ordLineNode.selectSingleNode( "deliveryPrice" ).text() );
      cNote       = ordLineNode.selectSingleNode( "comment" ).text();

      delivNode   = ordLineNode.selectSingleNode("//delivery");
      custNode   = delivNode.selectSingleNode("//address");
      cUserName  = custNode.selectSingleNode( "firstname" ).text();
      cUserLName = custNode.selectSingleNode( "lastname" ).text();
      cUserPhone = custNode.selectSingleNode( "phone" ).text();
      cUserEMail = custNode.selectSingleNode( "email" ).text();
      cUserCity  = custNode.selectSingleNode( "city" ).text();
      cUserAdr   = custNode.selectSingleNode( "address" ).text();
      cUserHNum  = custNode.selectSingleNode( "houseNumber" ).text();

      //cartNode  = ordLineNode.selectSingleNode( "//cart" );
      //prodNodes = cartNode.selectSingleNode( "//products" );
      //  prodNode  = prodNodes.selectNodes( "//product" );

      // пробывал разные версии ...

      prodNode  = ordLineNode.selectNodes( "//product" );

      for ( u = 0; u < prodNode.length(); u ++ )
      {
         prodLNode = prodNode.item( u );
         nQty     = str2num( prodLNode.selectSingleNode( "quantity" ).text() );
         cSkuVar  = prodLNode.selectSingleNode( "variation" ).text();
         cItm     = prodLNode.selectSingleNode( "sku" ).text();
         nPrc     = str2num( prodLNode.selectSingleNode( "price" ).text() );

         n1       = strscan( cSkuVar, "_", 1, 100 );
         n2       = strscan( cSkuVar, "_", n1 + 1, 100 );
         cCnf     = substr( cSkuVar, n1 + 1, n2 - n1 );
         aCart.ContAdd( [ cOrd, cItm, cCnf, nQty, nPrc ] );
      }
   }
В примере хмл 4 заказа . Вот например , первый заказ ( <order><id>ut_11 ) . В его карте только один товар ( <product> node ) . Но prodNode = ordLineNode.selectNodes( "//product" ); дает все <product> , и от других заказов . Как мне етого избежать ? Как получить лист только для текущего ordLineNode ? Напр. последний заказ имеет 2 строки продуктов ...

С уважением , Римантас
Старый 29.08.2012, 18:12   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Цитата:
Сообщение от Rimantas Посмотреть сообщение
Но prodNode = ordLineNode.selectNodes( "//product" ); дает все <product> , и от других заказов
Два слэша в начале запроса указывают, что рекурсивный поиск будет осуществляться от корня, а не от текущего узла.

Попробуйте в шаблон добавить точку, т.е. сделать так ordLineNode.selectNodes(".//product")
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: gl00mie (2), alex55 (1).
Старый 30.08.2012, 09:17   #3  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AndyD Посмотреть сообщение
Два слэша в начале запроса указывают, что рекурсивный поиск будет осуществляться от корня, а не от текущего узла.

Попробуйте в шаблон добавить точку, т.е. сделать так ordLineNode.selectNodes(".//product")
То , что надо ... . Етого ".//" незаметил в примерах и незнал . Большое спасибо !

С уважением, Римантас
Теги
xml

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
X++: Serializing Axapta Foundation Class instances as XML streams Blog bot DAX Blogs 0 04.06.2009 23:05
Dynamics AX FAQ: How to import and export data in XML format using Axd classes? Blog bot DAX Blogs 0 18.06.2008 20:05
Axapta & XML dj_Mage DAX: Программирование 4 11.08.2006 12:42
XML в Axapta axot DAX: Программирование 4 01.11.2002 11:37
Введение в Аксапту Роман Кошелев DAX: Прочие вопросы 0 18.12.2001 14:00

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

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

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