using System.Collections.Generic;
using System.Xml.Serialization;
using System.Diagnostics;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Collections;
namespace Question42409171
public class XMLStructure
public List<Project> LProject;
LProject = new List<Project>();
public NameElement Defines;
public NameElement Include;
public NameElement Ref_mot;
public NameElement Folder;
[XmlElement("MotCommand")]
public NameElement MotCommand;
[XmlElement("Param4MotCommand")]
public NameElement Param4MotCommand;
[XmlElement("ExtraDefine")]
public NameElement ExtraDefine;
public Package MYPackage;
public MotImage Mot_Image;
[XmlElement("MigrationAndDevicesBin")]
public MigrationAndDevicesBin _MigrationAndDevicesBin;
[XmlElement("SerialFlashHexImage")]
public SerialFlashHexImage MYSerialFlashHexImage;
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();
[XmlElement("Boot_path")]
public NameElement Boot_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;
Boot_path = new NameElement();
Rsu_path = new NameElement();
Release_path = new NameElement();
Image_path = new NameElement();
Catalog_number = new NameElement();
Additional_text = new NameElement();
[XmlElement("Release_path")]
public NameElement Release_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;
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
public List<Device> _Device;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
[XmlElement("OutputFile")]
public OutputFile OutPutFile;
public MigrationAndDevicesBin()
_Device = new List<Device>();
Catalog_number = new NameElement();
OutPutFile = new OutputFile();
[XmlAttribute("productType")]
public string productType;
[XmlAttribute("swVersion")]
[XmlAttribute("pathname")]
public class SerialFlashHexImage
public List<File> Files { get; set; }
public SerialFlashHexImage()
this.Files = new List<File>();
[XmlAttribute("fileType")]
[XmlAttribute("pathname")]
[XmlElement("OutputFile")]
public OutputFile OutputFile;
[XmlElement("Catalog_number")]
public NameElement Catalog_number;
OutputFile = new OutputFile();
Catalog_number = new NameElement();
items = new List<Item>();
var 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"">
<Release_path name="""" />
<Catalog_number name="""" />
<Additional_text name="""" />
<Package name="""" exec=""3"">
<Release_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="""" />
<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="""" />
<Flasher name=""CreateHexFile"" exec=""6"">
<Item name=""port"" value="""" />
<Item name=""default_mot_file_full_path"" value="""" />
<Item name=""flasher_exe_full_path"" value="""" />
<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"">
<Release_path name="""" />
<Catalog_number name="""" />
<Additional_text name="""" />
<Package name="""" exec=""3"">
<Release_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="""" />
<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="""" />
<Flasher name=""CreateHexFile"" exec=""6"">
<Item name=""port"" value="""" />
<Item name=""default_mot_file_full_path"" value="""" />
<Item name=""flasher_exe_full_path"" value="""" />
internal static void Test()
Console.WriteLine("Input XML: ");
Console.WriteLine(XElement.Parse(xml));
var root = xml.LoadFromXml<XMLStructure>();
var xml2 = root.GetXml(null, true);
Console.WriteLine("Deserialized and re-serialized XML: ");
var ok = XNode.DeepEquals(XElement.Parse(xml).OrderByName(), XElement.Parse(xml2).OrderByName());
Console.WriteLine(ok ? "Original and reserialized XML are equivalent." : "Original and reserialized XML are NOT equivalent.");
public static class XElementExtensions
public static XElement OrderByName(this XElement element)
return new XElement(element.Name,
from child in element.Nodes()
where child.NodeType != XmlNodeType.Element
from child in element.Elements()
orderby child.Name.ToString()
select OrderByName(child));
public static void Main()
public static class XmlSerializationHelper
public static T LoadFromXml<T>(this string xmlString)
using (StringReader reader = new StringReader(xmlString))
return (T)new XmlSerializer(typeof(T)).Deserialize(reader);
public static string GetXml<T>(this T obj, XmlSerializer serializer = null, bool omitStandardNamespaces = false)
XmlSerializerNamespaces ns = null;
if (omitStandardNamespaces)
ns = new XmlSerializerNamespaces();
using (var textWriter = new StringWriter())
var settings = new XmlWriterSettings() { Indent = true };
using (var xmlWriter = XmlWriter.Create(textWriter, settings))
(serializer ?? new XmlSerializer(obj.GetType())).Serialize(xmlWriter, obj, ns);
return textWriter.ToString();
public class AssertionFailedException : System.Exception
public AssertionFailedException() : base() { }
public AssertionFailedException(string s) : base(s) { }
public static class Assert
public static void IsTrue(bool value)
throw new AssertionFailedException("failed");