在C#中反序列化具有相同名称的多个XML元素

时间:2015-02-11 17:35:35

标签: c# xml deserialization

我试图解析这个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>

你可以看到&#34; Wind&#34;元素出现两次,这给了我很多时间,因为我显然不能容纳两个名为相同的变量。

我尝试通过编号元素来解决这个问题,而我的反序列化类现在看起来像这样:

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; }
}

现在问题还在继续.. 它将所有元素反序列化,直到第二个&#34; Wind&#34;正确地,在第二次&#34;风&#34; (包括)其余的元素是&#39; null&#39; 有什么建议吗?

1 个答案:

答案 0 :(得分:5)

这样可行,只需将风作为阵列:

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; }
    }
}