将 XML 反序列化为带有列表的 C# 对象
Deserialize XML into C# object with list
我正在尝试将 XML 反序列化为具有大量相同类型元素的 C# 对象。为了清楚起见,我已经删减了内容。我的 C# class 看起来像这样:
[XmlInclude(typeof(RootElement))]
[XmlInclude(typeof(Entry))]
[Serializable, XmlRoot("Form")]
public class DeserializedClass
{
public List<Entry> listEntry;
public RootElement rootElement { get; set; }
}
然后我定义Entry和RootElement classes如下:
public class RootElement
{
public string rootElementValue1 { get; set; }
public string rootElementValue2 { get; set; }
}
public class Entry
{
public string entryValue1 { get; set; }
public string entryValue2 { get; set; }
}
我正在尝试反序列化的 XML 的结构如下所示:
<Entry property="value">
<entryValue1>Data 1</entryValue1>
<entryValue2>Data 2</entryValue2>
<RootElement>
<rootElementValue1>Data 3</rootElementValue1>
<rootElementValue2>Data 4</rootElementValue2>
</RootElement>
<RootElement>
<rootElementValue1>Data 5</rootElementValue1>
<rootElementValue2>Data 6</rootElementValue2>
</RootElement>
</Entry>
如您所见,我想将多个 RootElement 元素反序列化到 C# 对象的列表中。要反序列化,我使用以下内容:
XmlSerializer serializer = new XmlSerializer(typeof(DeserializedClass));
using (StringReader reader = new StringReader(xml))
{
DeserializedClass deserialized = (DeserializedClass)serializer.Deserialize(reader);
return deserialized;
}
有什么解决办法吗?
我稍微调整了你的 classes 以使你的反序列化代码工作:
[Serializable, XmlRoot("Entry")]
public class DeserializedClass
{
public string entryValue1;
public string entryValue2;
[XmlElement("RootElement")]
public List<RootElement> rootElement { get; set; }
}
public class RootElement
{
public string rootElementValue1 { get; set; }
public string rootElementValue2 { get; set; }
}
现在可以正常使用了。
我不知道您为什么将 XmlRoot 声明为 "Form",因为 XML 中没有元素具有该名称,因此我将其替换为 "Entry"。
您不能将条目 class 与 entryvalue1 和 entryvalue2 属性一起使用,因为它们是根(事件)的直接子项并且没有子项作为条目。简而言之,您的 classes 必须反映 XML 的层次结构,以便反序列化能够正常工作。
我正在尝试将 XML 反序列化为具有大量相同类型元素的 C# 对象。为了清楚起见,我已经删减了内容。我的 C# class 看起来像这样:
[XmlInclude(typeof(RootElement))]
[XmlInclude(typeof(Entry))]
[Serializable, XmlRoot("Form")]
public class DeserializedClass
{
public List<Entry> listEntry;
public RootElement rootElement { get; set; }
}
然后我定义Entry和RootElement classes如下:
public class RootElement
{
public string rootElementValue1 { get; set; }
public string rootElementValue2 { get; set; }
}
public class Entry
{
public string entryValue1 { get; set; }
public string entryValue2 { get; set; }
}
我正在尝试反序列化的 XML 的结构如下所示:
<Entry property="value">
<entryValue1>Data 1</entryValue1>
<entryValue2>Data 2</entryValue2>
<RootElement>
<rootElementValue1>Data 3</rootElementValue1>
<rootElementValue2>Data 4</rootElementValue2>
</RootElement>
<RootElement>
<rootElementValue1>Data 5</rootElementValue1>
<rootElementValue2>Data 6</rootElementValue2>
</RootElement>
</Entry>
如您所见,我想将多个 RootElement 元素反序列化到 C# 对象的列表中。要反序列化,我使用以下内容:
XmlSerializer serializer = new XmlSerializer(typeof(DeserializedClass));
using (StringReader reader = new StringReader(xml))
{
DeserializedClass deserialized = (DeserializedClass)serializer.Deserialize(reader);
return deserialized;
}
有什么解决办法吗?
我稍微调整了你的 classes 以使你的反序列化代码工作:
[Serializable, XmlRoot("Entry")]
public class DeserializedClass
{
public string entryValue1;
public string entryValue2;
[XmlElement("RootElement")]
public List<RootElement> rootElement { get; set; }
}
public class RootElement
{
public string rootElementValue1 { get; set; }
public string rootElementValue2 { get; set; }
}
现在可以正常使用了。
我不知道您为什么将 XmlRoot 声明为 "Form",因为 XML 中没有元素具有该名称,因此我将其替换为 "Entry"。
您不能将条目 class 与 entryvalue1 和 entryvalue2 属性一起使用,因为它们是根(事件)的直接子项并且没有子项作为条目。简而言之,您的 classes 必须反映 XML 的层次结构,以便反序列化能够正常工作。