Как десериализовать атрибуты XML в объекты, а затем перебрать объекты - PullRequest
0 голосов
/ 15 октября 2018

Я хотел бы иметь возможность «делать что-то» с Транспортными средствами в файле XML.В идеале я хочу пройтись по всем транспортным средствам и сделать расчет по их цене, а также изменить, являются ли они OnSale.Эти значения будут отображаться в пользовательском интерфейсе.Мой код десериализует XML-файл, но я не могу получить доступ ни к одному из атрибутов автомобиля.Мне не нужно сериализовать объекты обратно в XML.

Я пытался Console.WriteLine the Price, однако когда я запускаю код, он возвращается как 0. Должен ли я создавать массив ResponseGeographyVendorRegionVehicle?а затем каким-то образом добавить объекты этого типа в массив?

Это XML-файл:

<?xml version="1.0" encoding="utf-8" ?>
<Response>
  <Geography>
    <Vendor id="JOHN">
      <Region id="1"></Region>
      <Region id="2">
        <Vehicle Make="HONDA" Fuel="Gas" Price="12000" OnSale="Y" Account="JOHNH" />
        <Vehicle Make="ACURA" Fuel="Gas" Price="14100" OnSale="Y" Account="JOHNH" />
        <Vehicle Make="TOYOTA" Fuel="Gas" Price="8000" OnSale="N" Account="JOHNH" />
        <Vehicle Make="HYUNDAI" Fuel="Gas" Price="13000" OnSale="Y" Account="JOHNH" />
        <Vehicle Make="INFINITY" Fuel="Gas" Price="16000" OnSale="N" Account="JOHNH" />
      </Region>
      <Region id="3"></Region>
      <Region id="4"></Region>
    </Vendor>
  </Geography>
</Response>

Это мой Program.cs:

namespace XMLDeserializeExample
{
    class Program 
    {
        static void Main(string[] args)
        {
            string path = @"c:\XMLFile1.xml";
            XmlRootAttribute xRoot = new XmlRootAttribute();
            xRoot.ElementName = "Response";
            XmlSerializer ser = new XmlSerializer(typeof(ResponseGeographyVendorRegionVehicle), xRoot);
            ResponseGeographyVendorRegionVehicle i;
            using (Stream reader = new FileStream(path,FileMode.Open)) 
            {
                i = (ResponseGeographyVendorRegionVehicle)ser.Deserialize(reader);
                Console.WriteLine(i.Price);
                Console.ReadLine();
            }
        }

    }
}

Это файл Paste Special Response.CS, который был создан:

namespace XMLDeserializeExample
{
}

// NOTE: Generated code may require at least .NET Framework 4.5 or .NET Core/Standard 2.0.
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class Response
{

    private ResponseGeography geographyField;

    /// <remarks/>
    public ResponseGeography Geography
    {
        get
        {
            return this.geographyField;
        }
        set
        {
            this.geographyField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ResponseGeography
{

    private ResponseGeographyVendor vendorField;

    /// <remarks/>
    public ResponseGeographyVendor Vendor
    {
        get
        {
            return this.vendorField;
        }
        set
        {
            this.vendorField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ResponseGeographyVendor
{

    private ResponseGeographyVendorRegion[] regionField;

    private string idField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Region")]
    public ResponseGeographyVendorRegion[] Region
    {
        get
        {
            return this.regionField;
        }
        set
        {
            this.regionField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ResponseGeographyVendorRegion
{

    private ResponseGeographyVendorRegionVehicle[] vehicleField;

    private byte idField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Vehicle")]
    public ResponseGeographyVendorRegionVehicle[] Vehicle
    {
        get
        {
            return this.vehicleField;
        }
        set
        {
            this.vehicleField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ResponseGeographyVendorRegionVehicle
{

    private string makeField;

    private string fuelField;

    private ushort priceField;

    private string onSaleField;

    private string accountField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Make
    {
        get
        {
            return this.makeField;
        }
        set
        {
            this.makeField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Fuel
    {
        get
        {
            return this.fuelField;
        }
        set
        {
            this.fuelField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ushort Price
    {
        get
        {
            return this.priceField;
        }
        set
        {
            this.priceField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string OnSale
    {
        get
        {
            return this.onSaleField;
        }
        set
        {
            this.onSaleField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string Account
    {
        get
        {
            return this.accountField;
        }
        set
        {
            this.accountField = value;
        }
    }
}

Пожалуйста, дайте мне знать, как я могу лучше объяснить себя.Извиняюсь, если ничего из этого не имеет смысла - добро пожаловать на мои выходные, лол.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Поскольку ваш xml-корень, очевидно, является Response вместо ResponseGeographyVendor, вам необходимо десериализовать этот тип:

string path = @"c:\XMLFile1.xml";
XmlSerializer ser = new XmlSerializer(typeof(response);
ResponseGeographyVendor i;
using (Stream reader = new FileStream(path,FileMode.Open)) 
{
    i = ((Response)ser.Deserialize(reader)).Geography.Vendor;
    Console.WriteLine(i.Price);
    Console.ReadLine();
}

Сериализатор будет работать только со всем xml-документом,Вы не можете просто написать или прочитать его части.Так что просто используйте xml, сериализуйте его в экземпляр Response и получите его Geography -член.

Теперь вы можете легко получить 3-й Vehicle в течение второго Region:

var vehicle = i.Region[1].Vehicle[2];

Обратите внимание, что вам не нужно предоставлять корень xml самостоятельно.

0 голосов
/ 15 октября 2018

Вы захотите использовать XML-сериализатор, встроенный в .Net.

Сначала создайте класс для представления данных документа XML:

public class Response
{
      public Geography Geography {get; set;}
}
public class Geography
{
       public Vendor Vendor{get;set;}
}
public class Vendor
{
      public List<Region> Regions {get;set;}
}
public class Region
{
}

и так далее.Затем прочитайте xml как строку и десериализуйте ее:

string myXml = File.ReadAsStringAsync(filepath).Result;
XmlSerializer ser = new XmlSerializer(typeof(Response));
using (TextReader reader = new StringReader(myXml)
{
Response myResponse = ser.Deserialize(reader);
}

Затем вы можете перебирать все свойства и вещи объекта Geography.

...