从 XML 到使用 XML 序列化 C# 的结构
from XML to structure using XML serialzation C#
我正在尝试使用 xml 序列化
阅读 xml
然而,当我尝试阅读 XML 时,我发现 xml 上名为 "Project" 的项目列表是空的。但是我有很多。
我认为我的代码中的问题在于我如何将 XML 描述为结构。
我正在附上我的 xml,我的代码会很高兴成为助手。
XML:
<MotProjects>
<Project name="IAR-PROJECT_PM_COMPLETE_PARTITION_2 -> M65_COMPLETE_JS702159_Release_vB17.110" exec="0">
<Defines name="PROJECT_PM_TYPE = PROJECT_PM_LE_PARTITION_2,SOFTWARE_TYPE = RELEASE_VER" />
<Make name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\PM_Pro.ewp" />
<Include name="C:\p4client\System\PowerMax_PRO\src\sw_def.h" />
<Ref_mot name="C:\P4client\System\PowerMax_PRO\bin\PM-LE\part-II\B17.110\Release\M65_COMPLETE_JS702159_Release_vB17.110.mot" />
<Folder name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\Project_Release_256k\Exe" />
<MotCommand name="C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\common\bin\IarBuild.exe" />
<Param4MotCommand name="-build Project_Release_256k PM_Pro_256k.mot" />
<ExtraDefine name="" />
<MotImage name="" exec="2">
<Boot_path name="" />
<Rsu_path name="" />
<Release_path name="" />
<Image_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</MotImage>
<Package name="" exec="3">
<Release_path name="" />
<Rsu_path name="" />
<Migration_path name="" />
<Default_path name="" />
<Old_Release_path name="" />
<Old_Default_path name="" />
<Package_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</Package>
<MigrationAndDevicesBin name="new MigrationAndDevicesBin project" exec="4">
<Migration id="0" productType="PMAX" swVersion="00.00.00" pathname="" />
<Device id="1" productType="IOV" swVersion="" pathname="" />
<Device id="2" productType="EXP33" swVersion="" pathname="" />
<Device id="3" productType="KP250" swVersion="" pathname="" />
<Device id="4" productType="" swVersion="" pathname="" />
<Device id="5" productType="" swVersion="" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</MigrationAndDevicesBin>
<SerialFlashHexImage name="new SerialFlashHexImage project" exec="5">
<File id="0" fileType="RSU" pathname="" />
<File id="1" fileType="Main" pathname="" />
<File id="2" fileType="Default" pathname="" />
<File id="3" fileType="MIG" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</SerialFlashHexImage>
<Flasher name="CreateHexFile" exec="6">
<Item name="port" value="" />
<Item name="default_mot_file_full_path" value="" />
<Item name="flasher_exe_full_path" value="" />
</Flasher>
</Project>
<Project name="IAR-PROJECT_DEFAULT_GENERAL_PM_LE_PARTITION_2 -> M65_JXXXXXX-vB17.110_PartII_gen" exec="0">
<Defines name="PROJECT_PM_TYPE = PROJECT_PM_LE_PARTITION_2,SOFTWARE_TYPE = DOWNLOAD_VER,PROJECT_PM_DEFAULT_TYPE = GEN_GSM_DEF" />
<Make name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\PM_Pro.ewp" />
<Include name="C:\p4client\System\PowerMax_PRO\src\sw_def.h" />
<Ref_mot name="C:\p4client\System\PowerMax_PRO\bin\PM-LE\part-II\B17.110\Special\MOT\M65_JXXXXXX-vB17.110_PartII_gen.mot" />
<Folder name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\Download_Release_256k\Exe" />
<MotCommand name="C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\common\bin\IarBuild.exe" />
<Param4MotCommand name="-build Download_Release_256k PM_Pro_Download_256k.mot" />
<ExtraDefine name="" />
<MotImage name="" exec="2">
<Boot_path name="" />
<Rsu_path name="" />
<Release_path name="" />
<Image_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</MotImage>
<Package name="" exec="3">
<Release_path name="" />
<Rsu_path name="" />
<Migration_path name="" />
<Default_path name="" />
<Old_Release_path name="" />
<Old_Default_path name="" />
<Package_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</Package>
<MigrationAndDevicesBin name="new MigrationAndDevicesBin project" exec="4">
<Migration id="0" productType="PMAX" swVersion="00.00.00" pathname="" />
<Device id="1" productType="IOV" swVersion="" pathname="" />
<Device id="2" productType="EXP33" swVersion="" pathname="" />
<Device id="3" productType="KP250" swVersion="" pathname="" />
<Device id="4" productType="" swVersion="" pathname="" />
<Device id="5" productType="" swVersion="" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</MigrationAndDevicesBin>
<SerialFlashHexImage name="new SerialFlashHexImage project" exec="5">
<File id="0" fileType="RSU" pathname="" />
<File id="1" fileType="Main" pathname="" />
<File id="2" fileType="Default" pathname="" />
<File id="3" fileType="MIG" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</SerialFlashHexImage>
<Flasher name="CreateHexFile" exec="6">
<Item name="port" value="" />
<Item name="default_mot_file_full_path" value="" />
<Item name="flasher_exe_full_path" value="" />
</Flasher>
</Project>
</MotProjects>
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace XMLParser
{
[XmlRoot("MotProjects")]
public class XMLStructure
{
[XmlArrayItem("Project")]
List<Project> LProject;
public XMLStructure()
{
LProject = new List<Project>();
}
public class Project
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlElement("Include")]
public NameElement Include;
[XmlElement("Ref_mot")]
public NameElement Ref_mot;
[XmlElement("Folder")]
public NameElement Folder;
[XmlElement("MotCommand")]
public NameElement MotCommand;
[XmlElement("Param4MotCommand")]
public NameElement Param4MotCommand;
[XmlElement("ExtraDefine")]
public NameElement ExtraDefine;
[XmlElement("Package")]
public Package MYPackage;
[XmlElement("MotImage")]
public MotImage Mot_Image;
[XmlElement("MigrationAndDevicesBin")]
public MigrationAndDevicesBin _MigrationAndDevicesBin;
[XmlElement("SerialFlashHexImage")]
public SerialFlashHexImage MYSerialFlashHexImage;
[XmlElement("Flasher")]
public Flasher MFlasher;
public Project()
{
name = "";
exec = "";
Include = new NameElement();
Ref_mot = new NameElement();
Folder = new NameElement();
MotCommand = new NameElement();
Param4MotCommand = new NameElement();
ExtraDefine = new NameElement();
Mot_Image = new MotImage();
MYPackage = new Package();
_MigrationAndDevicesBin = new MigrationAndDevicesBin();
MYSerialFlashHexImage = new SerialFlashHexImage ();
MFlasher = new Flasher();
}
public class NameElement
{
[XmlElement("name")]
public string name;
public NameElement()
{
name = "";
}
}
public class MotImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlElement("Boot_path")]
public NameElement Boot_path;
[XmlElement("Rsu_path")]
public NameElement Rsu_path;
[XmlElement("Release_path")]
public NameElement Release_path;
[XmlElement("Image_path")]
public NameElement Image_path;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("Additional_text")]
public NameElement Additional_text;
public MotImage()
{
name = "";
exec = "";
Boot_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Image_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
public class NameElement
{
[XmlElement("name")]
public string name;
public NameElement()
{
name = "";
}
}
}
public class Package
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlAttribute("Release_path")]
public NameElement Release_path;
[XmlAttribute("Rsu_path")]
public NameElement Rsu_path;
[XmlElement("Migration_path")]
public NameElement Migration_path;
[XmlElement("Default_path")]
public NameElement Default_path;
[XmlElement("Old_Release_path")]
public NameElement Old_Release_path;
[XmlElement("Old_Default_path")]
public NameElement Old_Default_path;
[XmlElement("Package_path")]
public NameElement Package_path;
[XmlElement("Additional_text")]
public NameElement Additional_text;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public Package()
{
name = "";
exec = "";
Release_path = new NameElement();
Rsu_path = new NameElement();
Migration_path = new NameElement();
Default_path = new NameElement();
Old_Default_path = new NameElement();
Old_Release_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
public class NameElement
{
[XmlElement("name")]
public string name;
public NameElement()
{
name = "";
}
}
}
public class MigrationAndDevicesBin
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlArray("Device")]
public List<Device> _Device;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("OutputFile")]
public OutputFile OutPutFile;
public MigrationAndDevicesBin()
{
name = "";
exec = "";
_Device = new List<Device>();
Catalog_number = new NameElement();
OutPutFile = new OutputFile();
}
}
public class Device
{
[XmlAttribute("id")]
public string id;
[XmlAttribute("productType")]
public string productType;
[XmlAttribute("swVersion")]
public string swVersion;
[XmlAttribute("pathname")]
public string pathname;
public Device()
{
id = "";
productType = "";
swVersion = "";
pathname = "";
}
}
public class OutputFile
{
[XmlElement("pathname")]
public string pathname;
public OutputFile()
{
pathname = "";
}
}
public class SerialFlashHexImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
public SerialFlashHexImage()
{
name="";
exec="";
}
public class File
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlAttribute("id")]
public string id;
[XmlAttribute("fileType")]
public string fileType;
[XmlAttribute("pathname")]
public string pathname;
[XmlElement("OutputFile")]
public OutputFile OutputFile;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public File()
{
name = "";
exec = "";
id = "";
fileType = "";
pathname = "";
OutputFile = new OutputFile();
Catalog_number = new NameElement();
}
}
}
public class Flasher
{
[XmlArray("Item")]
public Item items;
public Flasher()
{
items = new Item();
}
public class Item
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("value")]
public string value;
public Item()
{
name = "";
value = "";
}
}
}
}
}
}
你的初始问题如下:
您的 List<Project> LProject;
需要是 public,并用 [XmlElement]
标记以指示它应该在没有外部容器元素的情况下进行序列化:
// Fixed - made public and marked with [XmlElement]
[XmlElement("Project")]
public List<Project> LProject;
XmlSerializer
仅序列化 public 属性和字段,即使标记有 XML serialization attribute.
然而,在我修复此问题并尝试反序列化样本 XML 之后,我发现了更多问题:
在您的 class 层次结构中有多个类型 NameElement
的副本。这会导致 XmlSerializer
抛出以下异常:
// InnerException: System.InvalidOperationException
// Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
解决方案是消除重复项并保留一个定义:
// Fixed - removed duplicates.
// InnerException: System.InvalidOperationException
// Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
public class NameElement
{
// Fixed
// This was marked as an element but should be an attribute
[XmlAttribute("name")]
public string name;
public NameElement()
{
name = "";
}
}
在NameElement
中,name
应该标为[XmlAttribute]
而不是[XmlElement]
,如上图
Project
缺少几个属性:
// Fixed missing property
[XmlElement("Defines")]
public NameElement Defines;
// Fixed missing property
[XmlElement("Make")]
public NameElement Make;
// Fixed missing property
[XmlElement("Include")]
public NameElement Include;
在 Package
中,几个复杂的属性用 [XmlAttribute]
标记。只有简单的属性(可以转换为字符串的属性)才能如此标记。这些属性需要标记为[XmlElement]
:
// InnerException: System.InvalidOperationException
// Message="Cannot serialize member 'Release_path' of type Question42409171.XMLStructure.Project.Package.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
[XmlElement("Release_path")]
public NameElement Release_path;
// Fixed
// InnerException: System.InvalidOperationException
// Message="Cannot serialize member 'Rsu_path' of type Question42409171.XMLStructure.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
[XmlElement("Rsu_path")] // Fixed
public NameElement Rsu_path;
在MigrationAndDevicesBin
中属性_Device
需要用[XmlElement]
标记而不是[XmlArray]
:
public class MigrationAndDevicesBin
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed - should be [XmlElement]
[XmlElement("Device")]
public List<Device> _Device;
在 SerialFlashHexImage
中甚至从未使用过嵌套类型 File
。需要 属性 public List<File> Files { get; set; }
:
public class SerialFlashHexImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed - the type File was not even used!
[XmlElement("File")]
public List<File> Files { get; set; }
public SerialFlashHexImage()
{
this.Files = new List<File>();
name = "";
exec = "";
}
在Flasher
中,缺少name
和exec
对应的属性:
public class Flasher
{
// Fixed - missing attribute
[XmlAttribute("name")]
public string name;
// Fixed - missing attribute
[XmlAttribute("exec")]
public string exec;
同样在Flasher
中,items
需要是一个集合,而不是单例:
public class Flasher
{
//Fixed
//InnerException: System.InvalidOperationException
//Message="For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement."
[XmlElement("Item")]
public List<Item> items;
就我所知。样本 fiddle。 XML 可以成功加载并且 most 数据似乎存在,但我没有完全调试它,因为这样做超出了 Whosebug 问题的范围。
老实说,问题太多了。我建议您放弃手动创建 c# classes 来反序列化此 XML 的尝试,而是使用 https://xmltocsharp.azurewebsites.net/ or Paste XML as Classes 等自动代码生成工具创建 classes。 =50=]
以下是我对您的类型的最后修改:
[XmlRoot("MotProjects")]
public class XMLStructure
{
// Fixed - made public and marked with [XmlElement]
[XmlElement("Project")]
public List<Project> LProject;
public XMLStructure()
{
LProject = new List<Project>();
}
// Fixed - removed duplicates.
// InnerException: System.InvalidOperationException
// Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
public class NameElement
{
// Fixed
// This was marked as an element but should be an attribute
[XmlAttribute("name")]
public string name;
public NameElement()
{
name = "";
}
}
public class Project
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed missing property
[XmlElement("Defines")]
public NameElement Defines;
// Fixed missing property
[XmlElement("Make")]
public NameElement Make;
// Fixed missing property
[XmlElement("Include")]
public NameElement Include;
[XmlElement("Ref_mot")]
public NameElement Ref_mot;
[XmlElement("Folder")]
public NameElement Folder;
[XmlElement("MotCommand")]
public NameElement MotCommand;
[XmlElement("Param4MotCommand")]
public NameElement Param4MotCommand;
[XmlElement("ExtraDefine")]
public NameElement ExtraDefine;
[XmlElement("Package")]
public Package MYPackage;
[XmlElement("MotImage")]
public MotImage Mot_Image;
[XmlElement("MigrationAndDevicesBin")]
public MigrationAndDevicesBin _MigrationAndDevicesBin;
[XmlElement("SerialFlashHexImage")]
public SerialFlashHexImage MYSerialFlashHexImage;
[XmlElement("Flasher")]
public Flasher MFlasher;
public Project()
{
name = "";
exec = "";
Include = new NameElement();
Ref_mot = new NameElement();
Folder = new NameElement();
MotCommand = new NameElement();
Param4MotCommand = new NameElement();
ExtraDefine = new NameElement();
Mot_Image = new MotImage();
MYPackage = new Package();
_MigrationAndDevicesBin = new MigrationAndDevicesBin();
MYSerialFlashHexImage = new SerialFlashHexImage();
MFlasher = new Flasher();
}
public class MotImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlElement("Boot_path")]
public NameElement Boot_path;
[XmlElement("Rsu_path")]
public NameElement Rsu_path;
[XmlElement("Release_path")]
public NameElement Release_path;
[XmlElement("Image_path")]
public NameElement Image_path;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("Additional_text")]
public NameElement Additional_text;
public MotImage()
{
name = "";
exec = "";
Boot_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Image_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
}
public class Package
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed
// InnerException: System.InvalidOperationException
// Message="Cannot serialize member 'Release_path' of type Question42409171.XMLStructure.Project.Package.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
[XmlElement("Release_path")]
public NameElement Release_path;
// Fixed
// InnerException: System.InvalidOperationException
// Message="Cannot serialize member 'Rsu_path' of type Question42409171.XMLStructure.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
[XmlElement("Rsu_path")] // Fixed
public NameElement Rsu_path;
[XmlElement("Migration_path")]
public NameElement Migration_path;
[XmlElement("Default_path")]
public NameElement Default_path;
[XmlElement("Old_Release_path")]
public NameElement Old_Release_path;
[XmlElement("Old_Default_path")]
public NameElement Old_Default_path;
[XmlElement("Package_path")]
public NameElement Package_path;
[XmlElement("Additional_text")]
public NameElement Additional_text;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public Package()
{
name = "";
exec = "";
Release_path = new NameElement();
Rsu_path = new NameElement();
Migration_path = new NameElement();
Default_path = new NameElement();
Old_Default_path = new NameElement();
Old_Release_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
}
public class MigrationAndDevicesBin
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed - should be [XmlElement]
[XmlElement("Device")]
public List<Device> _Device;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("OutputFile")]
public OutputFile OutPutFile;
public MigrationAndDevicesBin()
{
name = "";
exec = "";
_Device = new List<Device>();
Catalog_number = new NameElement();
OutPutFile = new OutputFile();
}
}
public class Device
{
[XmlAttribute("id")]
public string id;
[XmlAttribute("productType")]
public string productType;
[XmlAttribute("swVersion")]
public string swVersion;
[XmlAttribute("pathname")]
public string pathname;
public Device()
{
id = "";
productType = "";
swVersion = "";
pathname = "";
}
}
public class OutputFile
{
[XmlElement("pathname")]
public string pathname;
public OutputFile()
{
pathname = "";
}
}
public class SerialFlashHexImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed - the type File was not even used!
[XmlElement("File")]
public List<File> Files { get; set; }
public SerialFlashHexImage()
{
this.Files = new List<File>();
name = "";
exec = "";
}
public class File
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlAttribute("id")]
public string id;
[XmlAttribute("fileType")]
public string fileType;
[XmlAttribute("pathname")]
public string pathname;
[XmlElement("OutputFile")]
public OutputFile OutputFile;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public File()
{
name = "";
exec = "";
id = "";
fileType = "";
pathname = "";
OutputFile = new OutputFile();
Catalog_number = new NameElement();
}
}
}
public class Flasher
{
// Fixed - missing attribute
[XmlAttribute("name")]
public string name;
// Fixed - missing attribute
[XmlAttribute("exec")]
public string exec;
//Fixed
//InnerException: System.InvalidOperationException
//Message="For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement."
[XmlElement("Item")]
public List<Item> items;
public Flasher()
{
items = new List<Item>();
name = "";
exec = "";
}
public class Item
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("value")]
public string value;
public Item()
{
name = "";
value = "";
}
}
}
}
}
我正在尝试使用 xml 序列化
阅读 xml然而,当我尝试阅读 XML 时,我发现 xml 上名为 "Project" 的项目列表是空的。但是我有很多。
我认为我的代码中的问题在于我如何将 XML 描述为结构。
我正在附上我的 xml,我的代码会很高兴成为助手。
XML:
<MotProjects>
<Project name="IAR-PROJECT_PM_COMPLETE_PARTITION_2 -> M65_COMPLETE_JS702159_Release_vB17.110" exec="0">
<Defines name="PROJECT_PM_TYPE = PROJECT_PM_LE_PARTITION_2,SOFTWARE_TYPE = RELEASE_VER" />
<Make name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\PM_Pro.ewp" />
<Include name="C:\p4client\System\PowerMax_PRO\src\sw_def.h" />
<Ref_mot name="C:\P4client\System\PowerMax_PRO\bin\PM-LE\part-II\B17.110\Release\M65_COMPLETE_JS702159_Release_vB17.110.mot" />
<Folder name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\Project_Release_256k\Exe" />
<MotCommand name="C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\common\bin\IarBuild.exe" />
<Param4MotCommand name="-build Project_Release_256k PM_Pro_256k.mot" />
<ExtraDefine name="" />
<MotImage name="" exec="2">
<Boot_path name="" />
<Rsu_path name="" />
<Release_path name="" />
<Image_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</MotImage>
<Package name="" exec="3">
<Release_path name="" />
<Rsu_path name="" />
<Migration_path name="" />
<Default_path name="" />
<Old_Release_path name="" />
<Old_Default_path name="" />
<Package_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</Package>
<MigrationAndDevicesBin name="new MigrationAndDevicesBin project" exec="4">
<Migration id="0" productType="PMAX" swVersion="00.00.00" pathname="" />
<Device id="1" productType="IOV" swVersion="" pathname="" />
<Device id="2" productType="EXP33" swVersion="" pathname="" />
<Device id="3" productType="KP250" swVersion="" pathname="" />
<Device id="4" productType="" swVersion="" pathname="" />
<Device id="5" productType="" swVersion="" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</MigrationAndDevicesBin>
<SerialFlashHexImage name="new SerialFlashHexImage project" exec="5">
<File id="0" fileType="RSU" pathname="" />
<File id="1" fileType="Main" pathname="" />
<File id="2" fileType="Default" pathname="" />
<File id="3" fileType="MIG" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</SerialFlashHexImage>
<Flasher name="CreateHexFile" exec="6">
<Item name="port" value="" />
<Item name="default_mot_file_full_path" value="" />
<Item name="flasher_exe_full_path" value="" />
</Flasher>
</Project>
<Project name="IAR-PROJECT_DEFAULT_GENERAL_PM_LE_PARTITION_2 -> M65_JXXXXXX-vB17.110_PartII_gen" exec="0">
<Defines name="PROJECT_PM_TYPE = PROJECT_PM_LE_PARTITION_2,SOFTWARE_TYPE = DOWNLOAD_VER,PROJECT_PM_DEFAULT_TYPE = GEN_GSM_DEF" />
<Make name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\PM_Pro.ewp" />
<Include name="C:\p4client\System\PowerMax_PRO\src\sw_def.h" />
<Ref_mot name="C:\p4client\System\PowerMax_PRO\bin\PM-LE\part-II\B17.110\Special\MOT\M65_JXXXXXX-vB17.110_PartII_gen.mot" />
<Folder name="C:\p4client\System\PowerMax_PRO\src\project\IAR Project\Download_Release_256k\Exe" />
<MotCommand name="C:\Program Files (x86)\IAR Systems\Embedded Workbench 5.4\common\bin\IarBuild.exe" />
<Param4MotCommand name="-build Download_Release_256k PM_Pro_Download_256k.mot" />
<ExtraDefine name="" />
<MotImage name="" exec="2">
<Boot_path name="" />
<Rsu_path name="" />
<Release_path name="" />
<Image_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</MotImage>
<Package name="" exec="3">
<Release_path name="" />
<Rsu_path name="" />
<Migration_path name="" />
<Default_path name="" />
<Old_Release_path name="" />
<Old_Default_path name="" />
<Package_path name="" />
<Catalog_number name="" />
<Additional_text name="" />
</Package>
<MigrationAndDevicesBin name="new MigrationAndDevicesBin project" exec="4">
<Migration id="0" productType="PMAX" swVersion="00.00.00" pathname="" />
<Device id="1" productType="IOV" swVersion="" pathname="" />
<Device id="2" productType="EXP33" swVersion="" pathname="" />
<Device id="3" productType="KP250" swVersion="" pathname="" />
<Device id="4" productType="" swVersion="" pathname="" />
<Device id="5" productType="" swVersion="" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</MigrationAndDevicesBin>
<SerialFlashHexImage name="new SerialFlashHexImage project" exec="5">
<File id="0" fileType="RSU" pathname="" />
<File id="1" fileType="Main" pathname="" />
<File id="2" fileType="Default" pathname="" />
<File id="3" fileType="MIG" pathname="" />
<Catalog_number name="JS######" />
<OutputFile pathname="" />
</SerialFlashHexImage>
<Flasher name="CreateHexFile" exec="6">
<Item name="port" value="" />
<Item name="default_mot_file_full_path" value="" />
<Item name="flasher_exe_full_path" value="" />
</Flasher>
</Project>
</MotProjects>
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace XMLParser
{
[XmlRoot("MotProjects")]
public class XMLStructure
{
[XmlArrayItem("Project")]
List<Project> LProject;
public XMLStructure()
{
LProject = new List<Project>();
}
public class Project
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlElement("Include")]
public NameElement Include;
[XmlElement("Ref_mot")]
public NameElement Ref_mot;
[XmlElement("Folder")]
public NameElement Folder;
[XmlElement("MotCommand")]
public NameElement MotCommand;
[XmlElement("Param4MotCommand")]
public NameElement Param4MotCommand;
[XmlElement("ExtraDefine")]
public NameElement ExtraDefine;
[XmlElement("Package")]
public Package MYPackage;
[XmlElement("MotImage")]
public MotImage Mot_Image;
[XmlElement("MigrationAndDevicesBin")]
public MigrationAndDevicesBin _MigrationAndDevicesBin;
[XmlElement("SerialFlashHexImage")]
public SerialFlashHexImage MYSerialFlashHexImage;
[XmlElement("Flasher")]
public Flasher MFlasher;
public Project()
{
name = "";
exec = "";
Include = new NameElement();
Ref_mot = new NameElement();
Folder = new NameElement();
MotCommand = new NameElement();
Param4MotCommand = new NameElement();
ExtraDefine = new NameElement();
Mot_Image = new MotImage();
MYPackage = new Package();
_MigrationAndDevicesBin = new MigrationAndDevicesBin();
MYSerialFlashHexImage = new SerialFlashHexImage ();
MFlasher = new Flasher();
}
public class NameElement
{
[XmlElement("name")]
public string name;
public NameElement()
{
name = "";
}
}
public class MotImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlElement("Boot_path")]
public NameElement Boot_path;
[XmlElement("Rsu_path")]
public NameElement Rsu_path;
[XmlElement("Release_path")]
public NameElement Release_path;
[XmlElement("Image_path")]
public NameElement Image_path;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("Additional_text")]
public NameElement Additional_text;
public MotImage()
{
name = "";
exec = "";
Boot_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Image_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
public class NameElement
{
[XmlElement("name")]
public string name;
public NameElement()
{
name = "";
}
}
}
public class Package
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlAttribute("Release_path")]
public NameElement Release_path;
[XmlAttribute("Rsu_path")]
public NameElement Rsu_path;
[XmlElement("Migration_path")]
public NameElement Migration_path;
[XmlElement("Default_path")]
public NameElement Default_path;
[XmlElement("Old_Release_path")]
public NameElement Old_Release_path;
[XmlElement("Old_Default_path")]
public NameElement Old_Default_path;
[XmlElement("Package_path")]
public NameElement Package_path;
[XmlElement("Additional_text")]
public NameElement Additional_text;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public Package()
{
name = "";
exec = "";
Release_path = new NameElement();
Rsu_path = new NameElement();
Migration_path = new NameElement();
Default_path = new NameElement();
Old_Default_path = new NameElement();
Old_Release_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
public class NameElement
{
[XmlElement("name")]
public string name;
public NameElement()
{
name = "";
}
}
}
public class MigrationAndDevicesBin
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlArray("Device")]
public List<Device> _Device;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("OutputFile")]
public OutputFile OutPutFile;
public MigrationAndDevicesBin()
{
name = "";
exec = "";
_Device = new List<Device>();
Catalog_number = new NameElement();
OutPutFile = new OutputFile();
}
}
public class Device
{
[XmlAttribute("id")]
public string id;
[XmlAttribute("productType")]
public string productType;
[XmlAttribute("swVersion")]
public string swVersion;
[XmlAttribute("pathname")]
public string pathname;
public Device()
{
id = "";
productType = "";
swVersion = "";
pathname = "";
}
}
public class OutputFile
{
[XmlElement("pathname")]
public string pathname;
public OutputFile()
{
pathname = "";
}
}
public class SerialFlashHexImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
public SerialFlashHexImage()
{
name="";
exec="";
}
public class File
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlAttribute("id")]
public string id;
[XmlAttribute("fileType")]
public string fileType;
[XmlAttribute("pathname")]
public string pathname;
[XmlElement("OutputFile")]
public OutputFile OutputFile;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public File()
{
name = "";
exec = "";
id = "";
fileType = "";
pathname = "";
OutputFile = new OutputFile();
Catalog_number = new NameElement();
}
}
}
public class Flasher
{
[XmlArray("Item")]
public Item items;
public Flasher()
{
items = new Item();
}
public class Item
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("value")]
public string value;
public Item()
{
name = "";
value = "";
}
}
}
}
}
}
你的初始问题如下:
您的
List<Project> LProject;
需要是 public,并用[XmlElement]
标记以指示它应该在没有外部容器元素的情况下进行序列化:// Fixed - made public and marked with [XmlElement] [XmlElement("Project")] public List<Project> LProject;
XmlSerializer
仅序列化 public 属性和字段,即使标记有 XML serialization attribute.
然而,在我修复此问题并尝试反序列化样本 XML 之后,我发现了更多问题:
在您的 class 层次结构中有多个类型
NameElement
的副本。这会导致XmlSerializer
抛出以下异常:// InnerException: System.InvalidOperationException // Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
解决方案是消除重复项并保留一个定义:
// Fixed - removed duplicates. // InnerException: System.InvalidOperationException // Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type." public class NameElement { // Fixed // This was marked as an element but should be an attribute [XmlAttribute("name")] public string name; public NameElement() { name = ""; } }
在
NameElement
中,name
应该标为[XmlAttribute]
而不是[XmlElement]
,如上图Project
缺少几个属性:// Fixed missing property [XmlElement("Defines")] public NameElement Defines; // Fixed missing property [XmlElement("Make")] public NameElement Make; // Fixed missing property [XmlElement("Include")] public NameElement Include;
在
Package
中,几个复杂的属性用[XmlAttribute]
标记。只有简单的属性(可以转换为字符串的属性)才能如此标记。这些属性需要标记为[XmlElement]
:// InnerException: System.InvalidOperationException // Message="Cannot serialize member 'Release_path' of type Question42409171.XMLStructure.Project.Package.NameElement. XmlAttribute/XmlText cannot be used to encode complex types." [XmlElement("Release_path")] public NameElement Release_path; // Fixed // InnerException: System.InvalidOperationException // Message="Cannot serialize member 'Rsu_path' of type Question42409171.XMLStructure.NameElement. XmlAttribute/XmlText cannot be used to encode complex types." [XmlElement("Rsu_path")] // Fixed public NameElement Rsu_path;
在
MigrationAndDevicesBin
中属性_Device
需要用[XmlElement]
标记而不是[XmlArray]
:public class MigrationAndDevicesBin { [XmlAttribute("name")] public string name; [XmlAttribute("exec")] public string exec; // Fixed - should be [XmlElement] [XmlElement("Device")] public List<Device> _Device;
在
SerialFlashHexImage
中甚至从未使用过嵌套类型File
。需要 属性public List<File> Files { get; set; }
:public class SerialFlashHexImage { [XmlAttribute("name")] public string name; [XmlAttribute("exec")] public string exec; // Fixed - the type File was not even used! [XmlElement("File")] public List<File> Files { get; set; } public SerialFlashHexImage() { this.Files = new List<File>(); name = ""; exec = ""; }
在
Flasher
中,缺少name
和exec
对应的属性:public class Flasher { // Fixed - missing attribute [XmlAttribute("name")] public string name; // Fixed - missing attribute [XmlAttribute("exec")] public string exec;
同样在
Flasher
中,items
需要是一个集合,而不是单例:public class Flasher { //Fixed //InnerException: System.InvalidOperationException //Message="For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement." [XmlElement("Item")] public List<Item> items;
就我所知。样本 fiddle。 XML 可以成功加载并且 most 数据似乎存在,但我没有完全调试它,因为这样做超出了 Whosebug 问题的范围。
老实说,问题太多了。我建议您放弃手动创建 c# classes 来反序列化此 XML 的尝试,而是使用 https://xmltocsharp.azurewebsites.net/ or Paste XML as Classes 等自动代码生成工具创建 classes。 =50=]
以下是我对您的类型的最后修改:
[XmlRoot("MotProjects")]
public class XMLStructure
{
// Fixed - made public and marked with [XmlElement]
[XmlElement("Project")]
public List<Project> LProject;
public XMLStructure()
{
LProject = new List<Project>();
}
// Fixed - removed duplicates.
// InnerException: System.InvalidOperationException
// Message="Types 'Question42409171.XMLStructure.Project.Package.NameElement' and 'Question42409171.XMLStructure.Project.NameElement' both use the XML type name, 'NameElement', from namespace ''. Use XML attributes to specify a unique XML name and/or namespace for the type."
public class NameElement
{
// Fixed
// This was marked as an element but should be an attribute
[XmlAttribute("name")]
public string name;
public NameElement()
{
name = "";
}
}
public class Project
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed missing property
[XmlElement("Defines")]
public NameElement Defines;
// Fixed missing property
[XmlElement("Make")]
public NameElement Make;
// Fixed missing property
[XmlElement("Include")]
public NameElement Include;
[XmlElement("Ref_mot")]
public NameElement Ref_mot;
[XmlElement("Folder")]
public NameElement Folder;
[XmlElement("MotCommand")]
public NameElement MotCommand;
[XmlElement("Param4MotCommand")]
public NameElement Param4MotCommand;
[XmlElement("ExtraDefine")]
public NameElement ExtraDefine;
[XmlElement("Package")]
public Package MYPackage;
[XmlElement("MotImage")]
public MotImage Mot_Image;
[XmlElement("MigrationAndDevicesBin")]
public MigrationAndDevicesBin _MigrationAndDevicesBin;
[XmlElement("SerialFlashHexImage")]
public SerialFlashHexImage MYSerialFlashHexImage;
[XmlElement("Flasher")]
public Flasher MFlasher;
public Project()
{
name = "";
exec = "";
Include = new NameElement();
Ref_mot = new NameElement();
Folder = new NameElement();
MotCommand = new NameElement();
Param4MotCommand = new NameElement();
ExtraDefine = new NameElement();
Mot_Image = new MotImage();
MYPackage = new Package();
_MigrationAndDevicesBin = new MigrationAndDevicesBin();
MYSerialFlashHexImage = new SerialFlashHexImage();
MFlasher = new Flasher();
}
public class MotImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlElement("Boot_path")]
public NameElement Boot_path;
[XmlElement("Rsu_path")]
public NameElement Rsu_path;
[XmlElement("Release_path")]
public NameElement Release_path;
[XmlElement("Image_path")]
public NameElement Image_path;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("Additional_text")]
public NameElement Additional_text;
public MotImage()
{
name = "";
exec = "";
Boot_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Image_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
}
public class Package
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed
// InnerException: System.InvalidOperationException
// Message="Cannot serialize member 'Release_path' of type Question42409171.XMLStructure.Project.Package.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
[XmlElement("Release_path")]
public NameElement Release_path;
// Fixed
// InnerException: System.InvalidOperationException
// Message="Cannot serialize member 'Rsu_path' of type Question42409171.XMLStructure.NameElement. XmlAttribute/XmlText cannot be used to encode complex types."
[XmlElement("Rsu_path")] // Fixed
public NameElement Rsu_path;
[XmlElement("Migration_path")]
public NameElement Migration_path;
[XmlElement("Default_path")]
public NameElement Default_path;
[XmlElement("Old_Release_path")]
public NameElement Old_Release_path;
[XmlElement("Old_Default_path")]
public NameElement Old_Default_path;
[XmlElement("Package_path")]
public NameElement Package_path;
[XmlElement("Additional_text")]
public NameElement Additional_text;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public Package()
{
name = "";
exec = "";
Release_path = new NameElement();
Rsu_path = new NameElement();
Migration_path = new NameElement();
Default_path = new NameElement();
Old_Default_path = new NameElement();
Old_Release_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
}
}
public class MigrationAndDevicesBin
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed - should be [XmlElement]
[XmlElement("Device")]
public List<Device> _Device;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("OutputFile")]
public OutputFile OutPutFile;
public MigrationAndDevicesBin()
{
name = "";
exec = "";
_Device = new List<Device>();
Catalog_number = new NameElement();
OutPutFile = new OutputFile();
}
}
public class Device
{
[XmlAttribute("id")]
public string id;
[XmlAttribute("productType")]
public string productType;
[XmlAttribute("swVersion")]
public string swVersion;
[XmlAttribute("pathname")]
public string pathname;
public Device()
{
id = "";
productType = "";
swVersion = "";
pathname = "";
}
}
public class OutputFile
{
[XmlElement("pathname")]
public string pathname;
public OutputFile()
{
pathname = "";
}
}
public class SerialFlashHexImage
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
// Fixed - the type File was not even used!
[XmlElement("File")]
public List<File> Files { get; set; }
public SerialFlashHexImage()
{
this.Files = new List<File>();
name = "";
exec = "";
}
public class File
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("exec")]
public string exec;
[XmlAttribute("id")]
public string id;
[XmlAttribute("fileType")]
public string fileType;
[XmlAttribute("pathname")]
public string pathname;
[XmlElement("OutputFile")]
public OutputFile OutputFile;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
public File()
{
name = "";
exec = "";
id = "";
fileType = "";
pathname = "";
OutputFile = new OutputFile();
Catalog_number = new NameElement();
}
}
}
public class Flasher
{
// Fixed - missing attribute
[XmlAttribute("name")]
public string name;
// Fixed - missing attribute
[XmlAttribute("exec")]
public string exec;
//Fixed
//InnerException: System.InvalidOperationException
//Message="For non-array types, you may use the following attributes: XmlAttribute, XmlText, XmlElement, or XmlAnyElement."
[XmlElement("Item")]
public List<Item> items;
public Flasher()
{
items = new List<Item>();
name = "";
exec = "";
}
public class Item
{
[XmlAttribute("name")]
public string name;
[XmlAttribute("value")]
public string value;
public Item()
{
name = "";
value = "";
}
}
}
}
}