Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反序列化每个重复的XML节点并将其映射到一个对象';使用C#Xml.Serialization库的s属性_C#_.net_Xml_Xml Deserialization_Objectmapper - Fatal编程技术网

反序列化每个重复的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));
    }
}