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文件中进行序列化。
您必须在Profiles列表属性中添加一些注释
[XmlArray("Profiles ")]
[XmlArrayItem("Profile", typeof(Profile))]
public List<Profile> Profiles = new List<Profile>();