C# 使用XmlSerializer,如何设置列表的元素名称?
我似乎无法使XmlSerializer属性正常工作。我有C# 使用XmlSerializer,如何设置列表的元素名称?,c#,xml,xmlserializer,C#,Xml,Xmlserializer,我似乎无法使XmlSerializer属性正常工作。我有 public class DriveData { public string Model { get; set; } public string Type { get; set; } public int SizeGB { get; set; } public string SerialNumber { get; set; } public bool IsOK { get; set; } } 静态
public class DriveData
{
public string Model { get; set; }
public string Type { get; set; }
public int SizeGB { get; set; }
public string SerialNumber { get; set; }
public bool IsOK { get; set; }
}
静态列表磁盘驱动器{get;set;}
XmlSerializer serializer=新的XmlSerializer(typeof(List));
FileStream xmlFile=File.Create(“DiskDrives.xml”);
serializer.Serialize(XML文件、磁盘驱动器);
xmlFile.Close();
我想要的是:
<?xml version="1.0" encoding="utf-8" ?>
<HardDrives>
<HardDrive>
<Model>Seagate1</Model>
...
</HardDrive>
<HardDrive>
...
</HardDrive>
希捷1
...
...
但我得到的是:
<?xml version="1.0"?>
<ArrayOfDriveData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DriveData>
<Model>Seagate1</Model>
<Type>SATA</Type>
<SizeGB>999</SizeGB>
...
</DriveData>
<DriveData>
...
</DriveData>
</ArrayOfDriveData>
希捷1
世达
999
...
...
[xmlement(ElementName=“HardDrives”)]
在我的列表中
不起任何作用<在myDriveData
类上的code>[XmlElement(ElementName=“HardDrive”)]会导致生成错误。如何将根和
元素名称设置为我想要的名称?虽然XmlSerializer
可以直接序列化列表,就像您使用新的XmlSerializer(typeof(List))
一样,但折衷办法是您不能对生成的元素名称做太多。更好的方法是将列表包装到一个类中,该类的属性如下:
[XmlRoot("HardDrives")]
public class DiskDrives
{
[XmlElement("HardDrive")]
public List<DriveData> Drives { get; set; }
}
<?xml version="1.0" encoding="utf-16"?>
<HardDrives xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<HardDrive>
<Model>WD</Model>
…
</HardDrive>
<HardDrive>
<Model>Seagate</Model>
…
</HardDrive>
</HardDrives>
<?xml version="1.0" encoding="utf-16"?>
<Inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
… more properties would be serialized here …
<HardDrives>
<HardDrive>
<Model>WD</Model>
…
</HardDrive>
<HardDrive>
<Model>Seagate</Model>
…
</HardDrive>
</HardDrives>
</Inventory>
如果要将列表
嵌入到更复杂的结构中,另一种方法是使用[XmlArray]
和[XmlArrayItem]
属性,这些属性控制IEnumerable
属性的序列化方式以及将哪些元素名称应用于其项。以下数据结构:
[XmlRoot("Inventory")]
public class Inventory
{
… more properties here…
[XmlArray("HardDrives")]
[XmlArrayItem("HardDrive")]
public List<DriveData> Drives { get; set; }
}
[XmlRoot(“库存”)]
公共类目录
{
…这里有更多的财产…
[XmlArray(“硬盘驱动器”)]
[XmlArrayItem(“硬盘”)]
公用列表驱动器{get;set;}
}
然后将生成如下所示的XML:
[XmlRoot("HardDrives")]
public class DiskDrives
{
[XmlElement("HardDrive")]
public List<DriveData> Drives { get; set; }
}
<?xml version="1.0" encoding="utf-16"?>
<HardDrives xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<HardDrive>
<Model>WD</Model>
…
</HardDrive>
<HardDrive>
<Model>Seagate</Model>
…
</HardDrive>
</HardDrives>
<?xml version="1.0" encoding="utf-16"?>
<Inventory xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
… more properties would be serialized here …
<HardDrives>
<HardDrive>
<Model>WD</Model>
…
</HardDrive>
<HardDrive>
<Model>Seagate</Model>
…
</HardDrive>
</HardDrives>
</Inventory>
…更多属性将在此处序列化…
WD
…
希捷
…
实现这一点可能有更多更好的方法,但这里有另一种方法
private static void GenerateXml()
{
List<DriveData> DiskDrives = new List<DriveData>();
DiskDrives.Add(new DriveData() { Model = "model1", Type = "type1", SizeGB = 10, SerialNumber = "20155", IsOK = false });
DiskDrives.Add(new DriveData() { Model = "model2", Type = "type2", SizeGB = 20, SerialNumber = "20165", IsOK = true });
var newDoc = new XDocument(new XDeclaration("1.0", null, "yes"));
XElement xmlElements = new XElement("HardDrives",
from item in DiskDrives
select new XElement("HardDrive",
new XElement("Model", item.Model),
new XElement("Type", item.Type),
new XElement("SizeGB", item.SizeGB),
new XElement("SerialNumber", item.SerialNumber),
new XElement("IsOK", item.IsOK)));
newDoc.Add(xmlElements);
newDoc.Save(@"C:\sample.xml");
}
private静态void GenerateXml()
{
List DiskDrives=新列表();
添加(newdrivedata(){Model=“model1”,Type=“type1”,SizeGB=10,SerialNumber=“20155”,IsOK=false});
添加(newdrivedata(){Model=“model2”,Type=“type2”,SizeGB=20,SerialNumber=“20165”,IsOK=true});
var newDoc=新XDocument(新XDeclaration(“1.0”,null,“yes”);
XElement xmlElements=新XElement(“硬盘驱动器”,
从磁盘驱动器中的项目
选择新XElement(“硬盘驱动器”,
新XElement(“模型”,项目模型),
新元素(“类型”,项目类型),
新XElement(“SizeGB”,item.SizeGB),
新XElement(“SerialNumber”,item.SerialNumber),
新的元素(“IsOK”,item.IsOK));
newDoc.Add(xmlElements);
Save(@“C:\sample.xml”);
}
输出XML:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<HardDrives>
<HardDrive>
<Model>model1</Model>
<Type>type1</Type>
<SizeGB>10</SizeGB>
<SerialNumber>20155</SerialNumber>
<IsOK>false</IsOK>
</HardDrive>
<HardDrive>
<Model>model2</Model>
<Type>type2</Type>
<SizeGB>20</SizeGB>
<SerialNumber>20165</SerialNumber>
<IsOK>true</IsOK>
</HardDrive>
</HardDrives>
模型1
类型1
10
20155
假的
模型2
类型2
20
20165
真的
您可以保留您的模型。创建序列化程序对象时,将类的XmlType属性和第二个参数用作新的XmlRootAttribute(“硬盘驱动器”)
[XmlType("HardDrive")]
public class DriveData
{
public string Model { get; set; }
public string Type { get; set; }
public int SizeGB { get; set; }
public string SerialNumber { get; set; }
public bool IsOK { get; set; }
}
class Program
{
static List<DriveData> DiskDrives { get; set; } = new List<DriveData>();
static void Main(string[] args)
{
DiskDrives.Add(new DriveData { Model = "Seagate1", Type = "SATA", SizeGB = 999 });
DiskDrives.Add(new DriveData { Model = "Seagate2", Type = "SATA", SizeGB = 777 });
XmlSerializer serializer = new XmlSerializer(typeof(List<DriveData>), new XmlRootAttribute("HardDrives"));
FileStream xmlFile = File.Create("DiskDrives.xml");
serializer.Serialize(xmlFile, DiskDrives);
xmlFile.Close();
Console.Read();
}
}
[XmlType(“硬盘驱动器”)]
公共类驱动数据
{
公共字符串模型{get;set;}
公共字符串类型{get;set;}
公共整数SizeGB{get;set;}
公共字符串序列号{get;set;}
公共bool IsOK{get;set;}
}
班级计划
{
静态列表磁盘驱动器{get;set;}=new List();
静态void Main(字符串[]参数)
{
添加(新的驱动器数据{Model=“segate1”,Type=“SATA”,SizeGB=999});
添加(新的驱动器数据{Model=“segate2”,Type=“SATA”,SizeGB=777});
XmlSerializer serializer=新的XmlSerializer(类型(列表),新的XmlRootAttribute(“硬盘”);
FileStream xmlFile=File.Create(“DiskDrives.xml”);
serializer.Serialize(XML文件、磁盘驱动器);
xmlFile.Close();
Console.Read();
}
}
Google XML序列化程序属性,您将对属性应用一个属性,并在该属性中指定一个名称。特别是Array和ArrayItem。您的示例XML不清楚。您是否希望有一个名为
的单亲家长和多个
子女?是。我的应用程序检索计算机硬盘上的数据。根“硬盘驱动器”元素将包含一个或多个“硬盘驱动器”元素,具体取决于其运行的系统。