如何解决使用 C# Xml.Serialization 库将每个重复的 XML 节点反序列化并将其映射到对象的属性
首先,如果我误解了反序列化过程和缺乏英语语言技能,我很抱歉。
因为我的问题总是被标记为不清楚和无用。
我会尽量说清楚。
我正在尝试对具有重复节点的 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; }
}
我是否必须编写另一种方法来将节点映射到属性?
我可以使用Serialization类直接反序列化并将XML映射到上述类吗?
我的目标是编写一个通用方法,可以反序列化任何 XML 并将其映射到任何对象。
我希望这是有道理的。
预先感谢您提供有关 C# 中正确反序列化过程的任何提示和建议。
问候
解决方法
我可以建议使用以下代码来正确填充提供的 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));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。