使用 C# Xml.Serialization 库反序列化每个重复 XML 节点并将其映射到对象的 属性
Deserialize and map each repeating XML node to an object's property using C# Xml.Serialization library
首先,如果我误解了反序列化过程和缺乏英语语言能力,我很抱歉。
因为我的问题总是被标记为不清楚且没有帮助。
我会尽量讲清楚。
我正在尝试反序列化并映射具有重复节点的 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>
表示目标对象的属性名称。
是 属性.
的值
我现在的class:
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; }
}
}
我设法使用上述 class 对 XML 进行了反序列化,并获得了一个包含 Field 对象数组的对象。
但我真正想要的是将 XML 反序列化为(比方说)下面 class.
每个 <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; }
}
我是否必须编写另一种方法来将节点映射到 属性?
我可以直接使用序列化 class 将 XML 反序列化并映射到上面的 class 吗?
我的目标是编写一个通用方法,可以反序列化并将任何 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));
}
}
首先,如果我误解了反序列化过程和缺乏英语语言能力,我很抱歉。
因为我的问题总是被标记为不清楚且没有帮助。
我会尽量讲清楚。
我正在尝试反序列化并映射具有重复节点的 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>
我现在的class:
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; }
}
}
我设法使用上述 class 对 XML 进行了反序列化,并获得了一个包含 Field 对象数组的对象。
但我真正想要的是将 XML 反序列化为(比方说)下面 class.
每个 <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; }
}
我是否必须编写另一种方法来将节点映射到 属性?
我可以直接使用序列化 class 将 XML 反序列化并映射到上面的 class 吗?
我的目标是编写一个通用方法,可以反序列化并将任何 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));
}
}