public List<DataItemRaw> DoRead()
        {
            List<DataItemRaw> result = new List<DataItemRaw>();

            try
            {
                Console.WriteLine("Start reading the XML file: " + _fullPathFileName + "   .....");
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(_fullPathFileName);

                //serealization
                Schema.FeedItems oResult = new Schema.FeedItems();
                Schema.FeedItems feedItems = (Schema.FeedItems)DeserializaXml(xmlDoc.InnerXml, oResult.GetType());
                if (feedItems != null)
                {
                    Console.WriteLine("Number of items read from XML: " + feedItems.Items.Length.ToString());
                }

                //loop through
                //  create DateItemRaw
                //  add to result
                foreach (Schema.FeedItemsFeedItem item in feedItems.Items)
                {
                    DataItemRaw rawItem = new DataItemRaw();
                    rawItem.DateCreated     = DateTime.ParseExact(item.DateCreated, "yyyy-MM-dd HH:mm:ss", null);
                    rawItem.DateModified    = DateTime.ParseExact(item.DateModified, "yyyy-MM-dd HH:mm:ss", null);
                    rawItem.SKU             = item.SKU;
                    rawItem.Name            = item.Name;
                    rawItem.Category        = item.Category;
                    rawItem.Description     = item.Description;
                    rawItem.Url             = item.Url;
                    rawItem.OriginalUrl     = item.OriginalUrl;
                    rawItem.ImageUrl        = item.Image;
                    rawItem.Price           = Convert.ToDecimal(item.Price.Replace("$", ""));
                    rawItem.Brand           = item.Brand;
                    rawItem.Colour          = item.Colour;
                    rawItem.Currency        = item.Currency;
                    rawItem.DeliveryCost    = item.DeliveryCost;
                    rawItem.DeliveryTime    = item.DeliveryTime;
                    rawItem.Feature         = item.Features;
                    rawItem.Gender          = item.Gender;
                    rawItem.Size            = item.Size;
                    rawItem.StockLevel      = item.StockLevel;

                    result.Add(rawItem);
                }

                Console.WriteLine("Finishing read the XML file: " + _fullPathFileName + "   .....");
                return result;
            }
            catch (Exception e)
            {
                Console.WriteLine("Read xml file failed\n" + e.ToString());
                return result;  //still return result although got exception
            }
        }
        //read csv one line and extract to DataItemRaw object, if fail will throw exception. this mean if one line fail - the whole thing fail (for now)
        private DataItemRaw ExtractLineData(string oneLine)
        {
            DataItemRaw lineItem = new DataItemRaw();
            try
            {
                //remove = for some field
                /*
                oneLine = oneLine.Replace(",=\"", ",\"");
                oneLine = oneLine.Substring(1, oneLine.Length - 2);
                string[] items = oneLine.Split(new string[] {"\",\""},StringSplitOptions.None );
                */
                string[] items = oneLine.Split(new string[] { "," }, StringSplitOptions.None);
                items = TrimValue(items);

                lineItem.DateCreated  = DateTime.ParseExact(items[0], "yyyy-MM-dd HH:mm:ss", null);
                lineItem.DateModified = DateTime.ParseExact(items[1], "yyyy-MM-dd HH:mm:ss", null);
                lineItem.SKU = items[2];
                lineItem.Name = items[3];
                lineItem.Category = items[4];
                lineItem.Description = items[5];
                lineItem.Url = items[6];
                lineItem.OriginalUrl = items[7];
                //image
                lineItem.ImageUrl = items[8];
                //price
                lineItem.Price = Convert.ToDecimal(items[15]);

                lineItem.Brand = items[16];
                lineItem.Colour = items[17];
                lineItem.Currency = items[18];
                lineItem.DeliveryCost = items[19];
                lineItem.DeliveryTime = items[20];
                lineItem.Feature = items[21];
                lineItem.Gender = items[22];
                lineItem.Size = items[23];
                lineItem.StockLevel = items[24];

            }
            catch (Exception e)
            {
                throw e;
            }

            return lineItem;
        }
        /*
         * the is specific procedure for CommissionFactory(now used only for The Iconic)
         *  - it will either add or update the feed item to local database
         */
        private void CommissionFactoryAddFeedItem(Batch batch, DataItemRaw item)
        {
            int batchId = batch.BatchId;
            int MID     = batch.Merchant.MerchantID;

            SqlCommand cmd = new SqlCommand("ProcessCFRawData", sqlConn);
            cmd.CommandType = CommandType.StoredProcedure;

            try
            {
                //passing parameter
                cmd.Parameters.Add(new SqlParameter("@BatchId", batchId));
                cmd.Parameters.Add(new SqlParameter("@MID", MID));
                cmd.Parameters.Add(new SqlParameter("@SKU", MID.ToString() + "-" + item.SKU.Trim()));
                cmd.Parameters.Add(new SqlParameter("@Name", item.Name));
                cmd.Parameters.Add(new SqlParameter("@Category", item.Category));
                cmd.Parameters.Add(new SqlParameter("@Description", item.Description));
                cmd.Parameters.Add(new SqlParameter("@Url", item.Url));
                cmd.Parameters.Add(new SqlParameter("@OriginalUrl", item.OriginalUrl));
                cmd.Parameters.Add(new SqlParameter("@ImageUrl", item.ImageUrl));
                cmd.Parameters.Add(new SqlParameter("@Price", item.Price));
                cmd.Parameters.Add(new SqlParameter("@DeliveryCost", RemNull(item.DeliveryCost)));
                cmd.Parameters.Add(new SqlParameter("@CurrencyCode", RemNull(item.Currency)));
                cmd.Parameters.Add(new SqlParameter("@Brand", item.Brand));
                cmd.Parameters.Add(new SqlParameter("@Colour", RemNull(item.Colour)));
                cmd.Parameters.Add(new SqlParameter("@Gender", RemNull(item.Gender)));
                cmd.Parameters.Add(new SqlParameter("@Size", RemNull(item.Size)));

                //execute
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Console.WriteLine("DatabaseManager.CommissionFactoryAddFeedItem is failed at Item SKU: " + item.SKU + " - " + ex.ToString());
            }
        }