使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性
Posted
技术标签:
【中文标题】使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性【英文标题】:Deserialize and map each repeating XML node to an object's property using C# Xml.Serialization library 【发布时间】:2021-07-04 21:01:53 【问题描述】:首先,如果我误解了反序列化过程和缺乏英语语言技能,我深表歉意。
因为我的问题总是被标记为不清楚和无用。
我会尽量说清楚。
我正在尝试反序列化和映射具有重复节点的 XML,并将其映射到对象。
目标对象有 10 个属性,而 XML 总是有 10 个节点。
XML:
<some_object>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
<field>
<field_name> </field_name>
<field_value> </field_value>
</field>
</some_object>
我现在的班级:
public class some_object
[XmlElement("field")]
public Field[] field get; set;
public class Field
public string field_name get; set;
public string field_value get; set;
我设法使用上面的类对 XML 进行反序列化,并获得一个包含 Field 对象数组的对象。
但我真正想要的是将 XML 反序列化为(比方说)下面的类。
每个<field>
都应该映射到一个属性。
<field_name>
表示属性名称,应该映射到该属性。
<field_value>
分配给该属性的值。
public class some_class
public int property1 get; set;
public DateTime property2 get; set;
public string property3 get; set;
public string property4 get; set;
public string property5 get; set;
public string property6 get; set;
public string property7 get; set;
public string property8 get; set;
public string property9 get; set;
public string property10 get; set;
我是否必须编写另一个方法来将节点映射到属性?
我可以使用序列化类直接反序列化并将XML映射到上述类吗?
我的目标是编写一个可以反序列化并将任何 XML 映射到任何对象的通用方法。
我希望这是有道理的。
提前感谢您提供有关 C# 中正确反序列化过程的任何提示和建议。
问候
【问题讨论】:
一般在这种cas中创建字典。 将任何 XML 映射到任何对象 - 这是不可能的。 【参考方案1】:我可以建议以下代码,该代码将正确地从提供的 xml 填充 some_class 属性。
var settings = new XmlReaderSettings IgnoreWhitespace = true ;
using var reader = XmlReader.Create("test.xml", settings);
var some = new some_class();
var properties = some.GetType().GetProperties(
BindingFlags.Public | BindingFlags.Instance);
while (reader.ReadToFollowing("field_name"))
string name = reader.ReadElementContentAsString();
int i = Array.FindIndex(properties, p => p.Name == name);
if (i != -1)
var p = properties[i];
Type type = p.PropertyType;
object value = null;
if (type == typeof(string))
value = reader.ReadElementContentAsString();
else if (type == typeof(int))
value = reader.ReadElementContentAsInt();
else if (type == typeof(DateTime))
value = reader.ReadElementContentAsDateTime();
// and so on...
p.SetValue(some, Convert.ChangeType(value, type));
【讨论】:
谢谢。看来我确实需要另一种方法来迭代对象的属性并将其与标签匹配。 我一定会尝试您的解决方案。 :)以上是关于使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性的主要内容,如果未能解决你的问题,请参考以下文章
在C#中 如何序列化图片 用System.Xml.Serialization.XmlSerializer这个可以吗?如果可以的话怎样使用?