使用 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));
    }
}