.net 反序列化嵌套元素的序列
如何将以下XML反序列化为我创建的实体,这让我感到困惑:.net 反序列化嵌套元素的序列,.net,xml-serialization,.net,Xml Serialization,如何将以下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">
<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>
3.
2016年2月22日8:35:00 PM-8:40:00 PM
10
2016年2月22日8:40:00 PM-8:45:00 PM
这些是我用过的课程。当我反序列化时,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; }
}
公共类值
{
[XmlAttribute(AttributeName=“totalcount”)]
公共整数TotalCount{get;set;}
[xmlement(ElementName=“version”)]
公共字符串版本{get;set;}
[xmlement(ElementName=“item”)]
public List ValueItems{get;set;}
}
公共类价值项目
{
[xmlement(ElementName=“datetime”)]
公共字符串日期时间{get;set;}
[xmlement(ElementName=“value”)]
公共值{get;set;}
}
公共阶级价值观
{
[XmlAttribute(AttributeName=“channel”)]
公共字符串通道{get;set;}
[XmlAttribute(AttributeName=“channelid”)]
公共字符串ChannelId{get;set;}
公共字符串值{get;set;}
}
我尝试过用XmlArrayItem(“item”)装饰ValueItems。我尝试了XmlArrayItem和XmlArray。我尝试过用XmlType(“item”)装饰ValueItem类
有什么想法吗?关于使用XmlAttributes的MSDN文档并不全面。您可以使用Visual Studio内置的XML to类从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;
}
}
}
//
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=”“,IsNullable=false)]
公共部分类值{
专用字节版本字段;
private valuesItem[]项目字段;
私人住宅区;
///
公共字节版本{
得到{
返回此.version字段;
}
设置{
this.versionField=值;
}
}
///
[System.Xml.Serialization.xmlementAttribute(“项”)]
公共价值项目[]项目{
得到{
返回此.itemField;
}
设置{
this.itemField=值;
}
}
///
[System.Xml.Serialization.XmlAttributeAttribute()]
公共卫生服务总数{
得到{
返回此.totalcountField;
}
设置{
this.totalcountField=值;
}
}
}
///
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类valuesItem{
私有字符串日期字段;
private ValueSite Value valueField;
///
公共字符串日期时间{
得到{
返回此.datetime字段;
}
设置{
this.datetimeField=值;
}
}
///
公共价值网站价值{
得到{
返回此.valueField;
}
设置{
this.valueField=值;
}
}
}
///
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类值SiteValue{
私有字符串信道域;
专用字节信道域;
私有字符串值字段;
///
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串频道{
得到{
返回此.channelField;
}
设置{
this.channelField=值;
}
}
///
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字节信道ID{
得到{
返回此.channelidField;
}
设置{
this.channelidField=值;
}
}
///
[System.Xml.Serialization.XmlTextAttribute()]
公共字符串值{
得到{
返回此.valueField;
}
设置{
this.valueField=值;
}
}
}
您只需使用Visual Studio内置的XML to类即可从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;
}
}
}
//
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=”“,IsNullable=false)]
公共部分类值{
专用字节版本字段;
private valuesItem[]项目字段;
私人住宅区;
///
公共字节版本{
得到{
返回此.version字段;
}
设置{
this.versionField=值;
}
}
///
[System.Xml.Serialization.xmlementAttribute(“项”)]
公共价值项目[]项目{
得到{
返回此.itemField;
}
设置{
this.itemField=值;
}
}
///
[System.Xml.Serialization.XmlAttributeAttribute()]
公共卫生服务总数{
得到{
返回此.totalcountField;
}
设置{
this.totalcountField=值;
}
}
}
///
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类valuesItem{
私有字符串日期字段;
private ValueSite Value valueField;
///
公共字符串日期时间{
得到{
返回此.datetime字段;
}
设置{
this.datetimeField=值;
}
}
///
公共价值网站价值{
得到{
返回此.valueField;
}
设置{
this.valueField=值;
}
}
}
///
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类值SiteValue{
私有字符串信道域;
专用字节信道域;
私有字符串值字段;
///
[System.Xml.Serialization.XmlAttributeAttribute()]
公共字符串频道{
得到{
返回此.channelField;
}
设置{
this.channelField=值;
}
}
///
[Sys
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));
}