Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.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
C# 使用XmlSerializer,如何设置列表的元素名称?_C#_Xml_Xmlserializer - Fatal编程技术网

C# 使用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; } } 静态

我似乎无法使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; }
}
静态列表磁盘驱动器{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”)]
在我的
列表中
不起任何作用<在my
DriveData
类上的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不清楚。您是否希望有一个名为
的单亲家长和多个
子女?是。我的应用程序检索计算机硬盘上的数据。根“硬盘驱动器”元素将包含一个或多个“硬盘驱动器”元素,具体取决于其运行的系统。