【问题标题】:Deserialize multiple XML elements with the same name in C#在 C# 中反序列化多个具有相同名称的 XML 元素
【发布时间】:2015-02-11 17:35:34
【问题描述】:

我正在尝试解析这个 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>

如您所见,“Wind”元素出现了两次,这让我很难受,因为我显然不能保存两个名称相同的变量。

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

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

现在问题还在继续.. 它正确反序列化所有元素,直到第二个“Wind”正确,并且在第二个“Wind”(包括)之后,其余元素为“null” 有什么建议吗?

【问题讨论】:

标签: c# xml deserialization


【解决方案1】:

这行得通,只需将 wind 设为一个数组即可:

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

【讨论】:

猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多