2016-02-26 103 views
1

我难倒如何反序列化下面的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和版本值每个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文档不完全全面。

回答

0

你可以使用内置的XML Visual Studio的上课从您的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; 
     } 
    } 
} 
+0

反序列化时抛出异常:当我添加XmlTy时不能包含匿名类型'Test.Values' pe属性与Anonymous = true。 – Emmanuel

+0

@Canoehead你如何反序列化它?它为我工作。 – Tyress

0

你唯一的问题看到像在SensorValue CALSS Value属性,其余工作正常。

要获取元素值,您需要使用XmlText属性。所以如果你只是补充说它应该可以正常工作。

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

以下代码段显示在样本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

(因为它没有在XML提供第二值是空)