【问题标题】:Deserializing sequence of nested elements反序列化嵌套元素的序列
【发布时间】:2016-02-26 02:17:14
【问题描述】:

我不知道如何将以下 XML 反序列化为我创建的实体:

 <values totalcount="576">
      <version>3</version>
      <item>
         <datetime>2/22/2016 8:35:00 PM - 8:40:00 PM</datetime>
         <value channel="Outside" channelid="4">10.0000</value>
      </item>
      <item>
         <datetime>2/22/2016 8:40:00 PM - 8:45:00 PM</datetime>
         <value channel="Inside" channelid="2"/>
      </item>
   </values>

这些是我使用过的类。当我反序列化时,使用正确数量的项目正确创建了 ValueItems 列表,并且我得到了正确的 TotalCount 和 Version 值但是每个 ValueItem 都有其成员的默认值而不是预期值:

public class Values
    {
        [XmlAttribute(AttributeName = "totalcount")]
        public int TotalCount { get; set; }

        [XmlElement(ElementName = "version")]
        public string Version { get; set; }

        [XmlElement(ElementName ="item")]
        public List<ValueItem> ValueItems { get; set; }
    }

  public class ValueItem
    {
        [XmlElement(ElementName = "datetime")]
        public string DateTime { get; set; }

        [XmlElement(ElementName="value")]
        public SensorValue Value { get; set; }
    }

public class SensorValue
    {
        [XmlAttribute(AttributeName = "channel")]
        public string Channel { get; set; }

        [XmlAttribute(AttributeName = "channelid")]
        public string ChannelId { get; set; }

        public string Value { get; set; }
    }

我尝试使用 XmlArrayItem("item") 来装饰 ValueItems。我已经尝试过 XmlArrayItem 和 XmlArray。我试过用 XmlType("item") 装饰 ValueItem 类。

有什么想法吗?关于使用 XmlAttributes 的 MSDN 文档并不十分全面。

【问题讨论】:

    标签: .net xml-serialization


    【解决方案1】:

    您可以使用 Visual Studio 内置的 XML 到类来从您的 XML 中获取它:

    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
    public partial class values {
    
        private byte versionField;
    
        private valuesItem[] itemField;
    
        private ushort totalcountField;
    
        /// <remarks/>
        public byte version {
            get {
                return this.versionField;
            }
            set {
                this.versionField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("item")]
        public valuesItem[] item {
            get {
                return this.itemField;
            }
            set {
                this.itemField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public ushort totalcount {
            get {
                return this.totalcountField;
            }
            set {
                this.totalcountField = value;
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
    public partial class valuesItem {
    
        private string datetimeField;
    
        private valuesItemValue valueField;
    
        /// <remarks/>
        public string datetime {
            get {
                return this.datetimeField;
            }
            set {
                this.datetimeField = value;
            }
        }
    
        /// <remarks/>
        public valuesItemValue value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
            }
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
    public partial class valuesItemValue {
    
        private string channelField;
    
        private byte channelidField;
    
        private string valueField;
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string channel {
            get {
                return this.channelField;
            }
            set {
                this.channelField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public byte channelid {
            get {
                return this.channelidField;
            }
            set {
                this.channelidField = value;
            }
        }
    
        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value {
            get {
                return this.valueField;
            }
            set {
                this.valueField = value;
            }
        }
    }
    

    【讨论】:

    • 反序列化时抛出异常:当我使用 Anonymous = true 添加 XmlType 属性时,无法包含匿名类型“Test.Values”。
    • @Canoehead 你是如何反序列化它的?它对我有用。
    【解决方案2】:

    您唯一的问题是 SensorValue 类中的 Value 属性,其余的工作正常。

    要获取元素值,您需要使用 XmlText 属性。因此,如果您只是添加它应该可以正常工作。

    [XmlText]
    public string Value { get; set; }
    

    下面的 sn-p 显示示例 XML 中的值:

    string xml = File.ReadAllText("XMLFile1.xml");
    using (StringReader reader = new StringReader(xml))
    {
        var serializer = new XmlSerializer(typeof(Values), new XmlRootAttribute("values") );
        var result = serializer.Deserialize(reader) as Values;
    
        result.ValueItems.ForEach(v => Console.WriteLine(v.Value.Value));
    }
    

    输出:

    10.0000

    (第二个值为 null,因为它没有在 XML 中提供)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2013-05-09
      • 2019-10-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多