Здраствуйте,
Первые шаги с импортом 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 строки продуктов ...
С уважением , Римантас