反序列化每个重复的XML节点并将其映射到一个对象';使用C#Xml.Serialization库的s属性
首先,如果我误解了反序列化过程和英语语言技能的缺乏,我很抱歉 因为我的问题总是被标记为不清楚和没有帮助 我会尽我所能把事情弄清楚反序列化每个重复的XML节点并将其映射到一个对象';使用C#Xml.Serialization库的s属性,c#,.net,xml,xml-deserialization,objectmapper,C#,.net,Xml,Xml Deserialization,Objectmapper,首先,如果我误解了反序列化过程和英语语言技能的缺乏,我很抱歉 因为我的问题总是被标记为不清楚和没有帮助 我会尽我所能把事情弄清楚 我正在尝试反序列化和映射一个具有重复节点的XML,并将其映射到一个对象 目标对象有10个属性,XML始终有10个节点 XML: <some_object> <field> <field_name> </field_name> <field_value> </field_valu
我正在尝试反序列化和映射一个具有重复节点的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>
我使用上述类成功地反序列化了XML,并获得了一个具有字段对象数组的对象
但我真正想要的是将XML反序列化到(比方说)下面的类
每个
都应该映射到一个属性。
指示属性名称,并应映射到该属性。
已分配给该属性的值
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#中正确反序列化过程的任何提示和建议
关于我可以建议使用以下代码从提供的xml中正确填充某些类属性
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));
}
}
通常在这个cas中创建一个字典。将任何XML映射到任何对象-这是不可能的。谢谢。似乎我确实需要另一种方法来迭代对象的属性并将其和标记匹配。我一定会尝试您的解决方案。:)
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));
}
}