简体   繁体   中英

Deserialize multiple XML elements with the same name in C#

Im trying to parse this XML response:

    <?xml version="1.0" encoding="utf-16"?>
<CurrentWeather>
  <Location>BOSTON LOGAN INTERNATIONAL, MA, United States (KBOS) 42-22N 071-01W 54M</Location>
  <Time>Feb 11, 2015 - 11:54 AM EST / 2015.02.11 1654 UTC</Time>
  <Wind> from the N (010 degrees) at 17 MPH (15 KT) gusting to 26 MPH (23 KT):0</Wind>
  <Visibility> 2 mile(s):0</Visibility>
  <SkyConditions> overcast</SkyConditions>
  <Temperature> 19.9 F (-6.7 C)</Temperature>
  <Wind>Windchill: 5 F (-15 C):1</Wind>
  <DewPoint> 12.9 F (-10.6 C)</DewPoint>
  <RelativeHumidity> 73%</RelativeHumidity>
  <Pressure> 30.08 in. Hg (1018 hPa)</Pressure>
  <Status>Success</Status>
</CurrentWeather>

As you can see the "Wind" element appears twice, and this is giving me hard time because I obviously can't hold 2 variables named the same.

I've tried solving this problem by numbering the elements, and my de-serialization class now looks like this:

public class CurrentWeather
{
    [XmlElement(Order = 1)]
    public string Location { get;  set; }
    [XmlElement(Order = 2)]
    public string Time { get;  set; }
    [XmlElement(Order = 3)]
    public string Wind { get;  set; }
    [XmlElement(Order = 4)]
    public string Visibility { get;  set; }
    [XmlElement(Order = 5)]
    public string SkyConditions { get;  set; }
    [XmlElement(Order = 6)]
    public string Temperature { get;  set; }
    [XmlElement(Order = 7)]
    public string WindTemperature { get;  set; }
    [XmlElement(Order = 8)]
    public string DewPoint { get;  set; }
    [XmlElement(Order = 9)]
    public string RelativeHumidity { get;  set; }
    [XmlElement(Order = 10)]
    public string Pressure { get;  set; }
    [XmlElement(Order = 11)]
    public string Status { get;  set; }
}

Now the problem continues.. It de-serializes all the elements until the second "Wind" correctly and after the second "Wind" (including) the rest of the elements are 'null' Any suggestions?

This works, just make wind an array:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WindDeserialize
{
    using System.IO;
    using System.Xml.Serialization;

    class Program
    {
        public const string xml = "<?xml version=\"1.0\" encoding=\"utf-16\"?>                                "+  
"<CurrentWeather>                                                                               "+
"  <Location>BOSTON LOGAN INTERNATIONAL, MA, United States (KBOS) 42-22N 071-01W 54M</Location> "+
"  <Time>Feb 11, 2015 - 11:54 AM EST / 2015.02.11 1654 UTC</Time>                               "+
"  <Wind> from the N (010 degrees) at 17 MPH (15 KT) gusting to 26 MPH (23 KT):0</Wind>         "+
"  <Visibility> 2 mile(s):0</Visibility>                                                        "+
"  <SkyConditions> overcast</SkyConditions>                                                     "+
"  <Temperature> 19.9 F (-6.7 C)</Temperature>                                                  "+
"  <Wind>Windchill: 5 F (-15 C):1</Wind>                                                        "+
"  <DewPoint> 12.9 F (-10.6 C)</DewPoint>                                                       "+
"  <RelativeHumidity> 73%</RelativeHumidity>                                                    "+
"  <Pressure> 30.08 in. Hg (1018 hPa)</Pressure>                                                "+
"  <Status>Success</Status>                                                                     "+
"</CurrentWeather>                                                                              ";
        static void Main(string[] args)
        {
            XmlSerializer ser = new XmlSerializer(typeof(CurrentWeather));

            var weather = (CurrentWeather)ser.Deserialize(new StringReader(xml));

        }


    }

    public class CurrentWeather
    {
        [XmlElement]
        public string Location { get; set; }
        [XmlElement]
        public string Time { get; set; }
        [XmlElement]
        public string [] Wind { get; set; }
        [XmlElement]
        public string Visibility { get; set; }
        [XmlElement]
        public string SkyConditions { get; set; }
        [XmlElement]
        public string Temperature { get; set; }
        [XmlElement]
        public string DewPoint { get; set; }
        [XmlElement]
        public string RelativeHumidity { get; set; }
        [XmlElement]
        public string Pressure { get; set; }
        [XmlElement]
        public string Status { get; set; }
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM