Чтение данных из XML - C# (197654)

Узнай цену своей работы

Формулировка задачи:

Есть объект - продукт. У него есть свои свойства. Есть коллекция этих объектов.
/// <summary>
        /// Метод реализующий загрузку продуктов из базы данных
        /// </summary>       
        String LastNodeName = "";
        ProductModel newProduct = new ProductModel();
        public void LoadDataM()
        {           
            using (XmlReader xml = XmlReader.Create("DataBaseProducts.xml"))
            {
                while (xml.Read())
                {                    
                    switch (xml.NodeType)
                    {
                        case XmlNodeType.Element:
                            LastNodeName = xml.Name;
                            break;
                        case XmlNodeType.Text:
                            if (LastNodeName == "name")
                            {                                
                                newProduct.Name = xml.Value;
                            }
                            else if (LastNodeName == "calories")
                            {
                                newProduct.Calories = Convert.ToDouble(xml.Value);
                            }
                            else if (LastNodeName == "proteins")
                            {
                                newProduct.Proteins = Convert.ToDouble(xml.Value);
                            }
                            else if (LastNodeName == "fats")
                            {
                                newProduct.Fats = Convert.ToDouble(xml.Value);
                            }
                            else if (LastNodeName == "carbohydrates")
                            {
                                newProduct.Carbohydrates = Convert.ToDouble(xml.Value);
                            }
                            else if (LastNodeName == "picturepath")
                            {
                                newProduct.PicturePath = xml.Value;
                            }
                            else if (LastNodeName == "weight")
                            {
                                newProduct.Weight = Convert.ToDouble(xml.Value);
                                if (newProduct.Name != null & newProduct.Calories != 0 & newProduct.Proteins != 0 & newProduct.Fats != 0 &
                        newProduct.Carbohydrates != 0 & newProduct.PicturePath != null & newProduct.Weight != 0)
                                {
                                    DataProduct.Add(newProduct);                                                            
                                }
                            }
                           break;
                    }                                   
                }
            }
        }
Метод работает, продукты добавляет, но при записи нового, свойства старого, тоже меняются. В итоге я получаю коллекцию одинаковых продуктов - того который записан последним.

Решение задачи: «Чтение данных из XML»

textual
Листинг программы
class Program {
    static void Main(string[] args) {
        List<ProductModel> products = new List<ProductModel>();
        using(XmlReader xml=XmlReader.Create("Products.xml")){                
            ProductModel product = null;
            while(xml.Read()){
                switch (xml.NodeType) {
                    case XmlNodeType.Element:
                        if (xml.Name == "product")
                            product = new ProductModel();
                        if (xml.Name == "name" || xml.Name == "calories") {
                            string name = xml.Name;
                            if (xml.Read() && xml.NodeType == XmlNodeType.Text && product != null) {
                                string value = xml.Value;
                                switch (name) {
                                    case "name":
                                        product.Name = value;
                                        break;
                                    case "calories":
                                        product.Calories = Double.Parse(value);
                                        break;
                                }
                            }
                        }
                        break;
                    case XmlNodeType.EndElement:
                        if (xml.Name == "product" && product != null) 
                            products.Add(product);
                        break;
                }                    
            }
        }
        foreach (ProductModel product in products)
            Console.WriteLine(product);
        Console.ReadKey();
    }
}
public class ProductModel {
    public string Name { get; set; }
    public double Calories { get; set; }
    public override string ToString() {
        return String.Format("{0}|{1}",Name,Calories);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5