XML反序列化到类,添加到列表

本文关键字:添加 列表 反序列化 XML | 更新日期: 2023-09-27 18:13:39

我正在创建一个具有导入功能的应用程序,允许最终用户导入XML配置文件。

主应用程序配置XML文件(CONFIG_FILE)本身包含以下格式:

<Config>
  <Facilities>
    <Facility>
      <Profiles>
        <Profile>
          <Name>Test</Name>
        </Profile>
      </Profiles>
      <ID>1</ID>
      <Name>Facility Name</Name>
    </Facility>
  </Facilities>
</Config>

注:<Facilities>下可以有多个<Facility>节点。节点具有相同的性质;<Profiles>主母体下可存在多个<Profile>节点。当导入配置文件时,我想采用<Facility>节点(及其子项目,如各自的和节点)并将它们放在主CONFIG_FILE中。

可以导入的用户配置文件格式如下:

<Facility xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Profiles>
    <Profile>
      <Name>Test</Name>
    </Profile>
  </Profiles>
  <ID>15</ID>
  <Name>Facility Name</Name>
</Facility>

导入的文件类型为GZip压缩文件。下面是配置文件导入的代码逻辑。基本上,它将对从文件对话框窗口中选择的文件进行反序列化。

var config = new Config();
if (File.Exists(CONFIG_FILE)) config = Serializer.DeserializeObjectFromFile<Config>(CONFIG_FILE);
Facility facilityBundle;
FileStream stream = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read);
using (Stream stream2 = new GZipStream(stream, CompressionMode.Decompress))
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(Facility));
    facilityBundle = (Facility)xmlSerializer.Deserialize(stream2);
}
config.Facilities.Add(new Facility { ID = facilityBundle.ID, Name = facilityBundle.Name });
Serializer.SerializeObjectToFile<Config>(config, CONFIG_FILE);

下面是序列化/反序列化的类:

[XmlRoot("Facility")]
public class Facility
{
    public string ID { get; set; }
    public string Name { get; set; }
    public List<Profile> Profiles = new List<Profile>();
}
public class Profile
{
    public string Name { get; set; }
}
public class Config
{
    public List<Facility> Facilities { get; set; }
}   

我遇到的问题是,当导入配置文件时,它完全忽略了<Profiles>节点及其子<Profile>节点…所以主CONFIG_FILE在导入后看起来是这样的:

<Config>
  <Facilities>
    <Facility>
      <ID>1</ID>
      <Name>Facility Name</Name>
    </Facility>
  </Facilities>
</Config>
基本上,我需要一种方法来反序列化XML文件的对象,以便将它们注入到另一个XML文件中进行序列化。

XML反序列化到类,添加到列表

您必须在Profiles列表属性中添加一些注释

[XmlArray("Profiles ")]
[XmlArrayItem("Profile", typeof(Profile))]
public List<Profile> Profiles = new List<Profile>();