使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性

Posted

技术标签:

【中文标题】使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性【英文标题】:Deserialize and map each repeating XML node to an object's property using C# Xml.Serialization library 【发布时间】:2021-07-04 21:01:53 【问题描述】:

首先,如果我误解了反序列化过程和缺乏英语语言技能,我深表歉意。

因为我的问题总是被标记为不清楚和无用。

我会尽量说清楚。


我正在尝试反序列化和映射具有重复节点的 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 反序列化为(比方说)下面的类。

每个&lt;field&gt; 都应该映射到一个属性。 &lt;field_name&gt; 表示属性名称,应该映射到该属性。 &lt;field_value&gt; 分配给该属性的值。

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# 中正确反序列化过程的任何提示和建议。

问候

【问题讨论】:

一般在这种cas中创建字典。 将任何 XML 映射到任何对象 - 这是不可能的。 【参考方案1】:

我可以建议以下代码,该代码将正确地从提供的 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));
    

【讨论】:

谢谢。看来我确实需要另一种方法来迭代对象的属性并将其与标签匹配。 我一定会尝试您的解决方案。 :)

以上是关于使用 C# Xml.Serialization 库反序列化每个重复的 XML 节点并将其映射到对象的属性的主要内容,如果未能解决你的问题,请参考以下文章

在C#中 如何序列化图片 用System.Xml.Serialization.XmlSerializer这个可以吗?如果可以的话怎样使用?

C# Xml 反序列化错误

如何反序列化 C# 中只有属性的 xml 元素?

c# 用XmlWriter写xml序列化

C# xml可序列化多值枚举

C# 使用Get,Post,Soap方式调用WebService