private ReadOnlyCollection <Product> ConvertProductsXmlToProducts(string productsXml)
            {
                List <Product> products = new List <Product>();

                XDocument xmlDocument = XDocument.Parse(productsXml);

                if (xmlDocument != null)
                {
                    string languageId = this.context.LanguageId;

                    var elements = xmlDocument.Root.Elements();
                    foreach (var element in elements)
                    {
                        Product product = new Product();
                        product.RecordId      = Convert.ToInt64(TransactionServiceClient.GetAttributeValue(element, "RecordId"));
                        product.ItemId        = TransactionServiceClient.GetAttributeValue(element, "ItemId");
                        product.ProductNumber = product.ItemId;

                        // Set the IsRemote flag to true for each of the retrieved products.
                        product.IsRemote = true;

                        string isKit = TransactionServiceClient.GetAttributeValue(element, "IsKit");
                        if (!string.IsNullOrWhiteSpace(isKit))
                        {
                            product.IsKit = Convert.ToBoolean(isKit);
                        }

                        string isMasterProduct = TransactionServiceClient.GetAttributeValue(element, "IsMasterProduct");
                        if (!string.IsNullOrWhiteSpace(isMasterProduct))
                        {
                            product.IsMasterProduct = Convert.ToBoolean(isMasterProduct);
                        }

                        string price = TransactionServiceClient.GetAttributeValue(element, "Price");
                        if (!string.IsNullOrWhiteSpace(price))
                        {
                            product.Price = Convert.ToDecimal(price);
                        }

                        int i          = 0;
                        var attributes = element.Elements("AttributeValues").Elements();
                        foreach (var attribute in attributes)
                        {
                            long   attributeId = Convert.ToInt64(TransactionServiceClient.GetAttributeValue(attribute, "Attribute"));
                            string textValue   = TransactionServiceClient.GetAttributeValue(attribute, "TextValue");
                            ////string unitValue = TransactionServiceClient.GetAttributeValue(attribute, "Unit");

                            var getChannelProductAttributeByIdDataRequest = new GetChannelProductAttributeByIdDataRequest(attributeId, new ColumnSet());
                            var productAttribute = this.context.Runtime.Execute <SingleEntityDataServiceResponse <AttributeProduct> >(getChannelProductAttributeByIdDataRequest, this.context).Entity;
                            if (productAttribute == null)
                            {
                                continue;
                            }

                            ProductProperty property = new ProductProperty();
                            property.AttributeValueId = productAttribute.AttributeValueRecordId;
                            property.RecordId         = productAttribute.RecordId;
                            property.PropertyType     = (ProductPropertyType)productAttribute.DataType;
                            property.KeyName          = productAttribute.KeyName;
                            property.Value            = textValue;
                            ////property.UnitText = unitValue;

                            // Create the default product schema.
                            product.IndexedProductSchema.Add(productAttribute.KeyName, i++);
                            product.SetProperty(productAttribute.KeyName, property);

                            if (!product.IndexedProductProperties.ContainsKey(languageId))
                            {
                                product.IndexedProductProperties[languageId] = new ProductPropertyDictionary();
                            }

                            product.IndexedProductProperties[languageId].Add(productAttribute.KeyName, property);
                        }

                        ProductBuilder.CompleteProductInstantiation(product);
                        products.Add(product);
                    }
                }

                return(products.AsReadOnly());
            }