-1

I Have XML file in my project

Here is it

  <?xml version="1.0"?>
<catalog>
   <car id="1">
      <model>Scoda Fabia</model>
      <year>2011</year>
      <producer>Folkwagen</producer>
      <price>6000</price>
      <owner>Bil Johnson</owner>
      <tel>+5810456455456</tel>
      <mileage>670000</mileage>
      <registered>USA</registered>
      <image>Fabia1.JPG</image>
   </car>
   <car id="2">
      <model>Huindai Getz</model>
      <year>2008</year>
      <producer>Huindai</producer>
      <price>5000</price>
      <owner>Dimitrious Gregorakis</owner>
      <tel>+5810456445456</tel>
      <mileage>120000</mileage>
      <registered>USA</registered>
      <image>hyundai_getz2.jpg</image>
   </car>
   <car id="3">
      <model>Huindai i108</model>
      <year>2014</year>
      <producer>Huindai</producer>
      <price>15000</price>
      <owner>Dex Dexter</owner>
      <tel>+5815556445456</tel>
      <mileage>30000</mileage>
      <registered>Canada</registered>
      <image>hyundaii108.jpg</image>
   </car>
   <car id="4">
      <model>Aveo</model>
      <year>2000</year>
      <producer>Shevrole</producer>
      <price>3500</price>
      <owner>Ivan Ivanov</owner>
      <tel>+5815556445477</tel>
      <mileage>300000</mileage>
      <registered>Mexico</registered>
      <image>aveo.jpg</image>
   </car>
</catalog>

I created a class from it, here is code for class

 [XmlRoot(ElementName = "car")]
public class Car
{
    [XmlElement(ElementName = "model")]
    public string Model { get; set; }
    [XmlElement(ElementName = "year")]
    public string Year { get; set; }
    [XmlElement(ElementName = "producer")]
    public string Producer { get; set; }
    [XmlElement(ElementName = "price")]
    public string Price { get; set; }
    [XmlElement(ElementName = "owner")]
    public string Owner { get; set; }
    [XmlElement(ElementName = "tel")]
    public string Tel { get; set; }
    [XmlElement(ElementName = "mileage")]
    public string Mileage { get; set; }
    [XmlElement(ElementName = "registered")]
    public string Registered { get; set; }
    [XmlElement(ElementName = "image")]
    public string Image { get; set; }
    [XmlAttribute(AttributeName = "id")]
    public string Id { get; set; }
}

[XmlRoot(ElementName = "catalog")]
public class Catalog
{
    [XmlElement(ElementName = "car")]
    public List<Car> Car { get; set; }
}

And Created ViewModel for it, where I defined observable collection anв define a method to fill it with data from XML

public class CarViewModel
{
    public ObservableCollection<List<Car>> car { get; set; }
    public void LoadCars()
    {
        Car = new ObservableCollection<List<Car>>();

        var path = @"xml\CarsDatabase.xml";
        using (TextReader reader = new StreamReader(path))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Catalog));
            return (Catalog)serializer.Deserialize(reader);
        }
    }
}

In method LoadCars I need to fill car observable collections with data in my file, that is inside of the project.

How I can do this correctly? Thank's for help.

UPDATE

I try to use this method

public void LoadCars()
    {
        Car = new ObservableCollection<List<Car>>();

        var path = @"xml\CarsDatabase.xml";
        using (TextReader reader = new StreamReader(path))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Catalog));
            return (Catalog)serializer.Deserialize(reader);
        }
    }

But now I have error

Severity Code Description Project File Line Suppression State Error CS0127 Since 'CarViewModel.LoadCars()' returns void, a return keyword must not be followed by an object expression DaxxTest C:\Users\nemes\Source\Repos\daxx_test\DaxxTest\DaxxTest\ViewModels\CarViewModel.cs 25 Active

Udara Abeythilake
  • 1,215
  • 1
  • 20
  • 31
Eugene Sukh
  • 2,357
  • 4
  • 42
  • 86
  • I updated code in question, added loading XML File@mjwills – Eugene Sukh Aug 12 '18 at 11:41
  • Possible duplicate of [How to Deserialize XML document](https://stackoverflow.com/questions/364253/how-to-deserialize-xml-document) – mjwills Aug 12 '18 at 11:43
  • 1
    Do you really mean `ObservableCollection>` and not, say, `List` or `ObservableCollection`? – fuglede Aug 12 '18 at 12:06
  • I edited this `public ObservableCollection Car { get; set; }` of course @fuglede – Eugene Sukh Aug 12 '18 at 12:11
  • Hi, "Car = new ObservableCollection>();": should be "car" and change ObservableCollection> to ObservableCollection. in both. P/S: you can copy paste my answer to check it. Cheer! – Nhan Phan Aug 12 '18 at 14:31

1 Answers1

2

Change

public ObservableCollection<List<Car>> car { get; set; } 

to

public ObservableCollection<Car> car { get; set; }

And use XmlSerializer to serialize your xml information. Check bellow code for an example:

        public ObservableCollection<Car> cars { get; set; }

        public void LoadCars()
        {

            XmlSerializer serializer = new XmlSerializer(typeof(Catalog));

            StreamReader reader = new StreamReader("CarsDatabase.xml");
            var catalog = (Catalog)serializer.Deserialize(reader);
            cars = new ObservableCollection<Car>(catalog.Car);
            reader.Close();
        }

        [Serializable()]
        public class Car
        {
            [XmlElement(ElementName = "model")]
            public string Model { get; set; }
            [XmlElement(ElementName = "year")]
            public string Year { get; set; }
            [XmlElement(ElementName = "producer")]
            public string Producer { get; set; }
            [XmlElement(ElementName = "price")]
            public string Price { get; set; }
            [XmlElement(ElementName = "owner")]
            public string Owner { get; set; }
            [XmlElement(ElementName = "tel")]
            public string Tel { get; set; }
            [XmlElement(ElementName = "mileage")]
            public string Mileage { get; set; }
            [XmlElement(ElementName = "registered")]
            public string Registered { get; set; }
            [XmlElement(ElementName = "image")]
            public string Image { get; set; }
            [XmlAttribute(AttributeName = "id")]
            public string Id { get; set; }
        }

        [Serializable()]
        [XmlRootAttribute("catalog", Namespace = "", IsNullable = false)]
        public class Catalog
        {
            [XmlElement(ElementName = "car")]
            public List<Car> Car { get; set; }
        }
Nhan Phan
  • 1,262
  • 1
  • 14
  • 32
  • Okay, But I also have Catalog, maybe I need to use it? – Eugene Sukh Aug 12 '18 at 14:32
  • You already used it to serialize your cars list. In case you need to use your Catalog some where, you can define other property/variable. – Nhan Phan Aug 12 '18 at 14:35
  • Yeah, but when I try to run code in main class like this `var carViewModel = new CarViewModel(); carViewModel.LoadCars(); DataContext = carViewModel;` Data context is null. – Eugene Sukh Aug 12 '18 at 14:50
  • Interesting! Could you please share your mainclass and xaml also? I tried from my side: public partial class MainWindow : Window { public MainWindow() { var carViewModel = new CarViewModel(); carViewModel.LoadCars(); this.DataContext = carViewModel; } } And it worked well – Nhan Phan Aug 12 '18 at 15:02
  • My problem is that system cannot find file – Eugene Sukh Aug 12 '18 at 15:23
  • : 'Could not find a part of the path 'C:\Users\nemes\source\repos\daxx_test\DaxxTest\DaxxTest\bin\Debug\xml\CarsDatabase.xml'.' – Eugene Sukh Aug 12 '18 at 15:29
  • Set the xml file as "Copy if newer" or you can copy-paste the xml file to "C:\Users\nemes\source\repos\daxx_test\DaxxTest\DaxxTest\bin\Debug\xml\" – Nhan Phan Aug 12 '18 at 15:32
  • It 's great when it can help you! Could you please check the answer as resolved? Thanks! – Nhan Phan Aug 12 '18 at 15:33
  • Let us [continue this discussion in chat](https://chat.stackoverflow.com/rooms/177920/discussion-between-nhan-phan-and-eugene-sukh). – Nhan Phan Aug 13 '18 at 04:06