将嵌套的 XML 反序列化为数组
Deserializing nested XML into arrays
我一直在尝试将 xml 文档反序列化为 class。我以前做过,但没有这么多嵌套。我非常想复制一个简单的目录树。我 运行 遇到的问题是文件方面。目录部分有效,我可以访问文件,但是将文件名反序列化为我的 class 并不完全匹配。我的 XMl 文档是:
<?xml version="1.0" encoding="utf-8"?>
<Directories>
<Directory Path="Path1">
<Files>
<File Type="None">File1</File>
<File Type="None">File2</File>
<File Type="EXE">File3</File>
</Files>
<Files>
<File Type="DLL">File4</File>
<File Type="None">File5</File>
<File Type="EXE">File6</File>
</Files>
<Files>
<File Type="DLL">File7</File>
<File Type="None">File8</File>
<File Type="EXE">File9</File>
</Files>
</Directory>
<Directory Path="Path2">
<Files>
<File Type="DLL">File10</File>
<File Type="None">File11</File>
<File Type="EXE">File12</File>
</Files>
<Files>
<File Type="DLL">File13</File>
<File Type="None">File14</File>
<File Type="EXE">File15</File>
</Files>
<Files>
<File Type="DLL">File16</File>
<File Type="None">File17</File>
<File Type="EXE">File18</File>
</Files>
</Directory>
<Directory Path="Path3">
<Files>
<File Type="DLL">File19</File>
<File Type="None">File20</File>
<File Type="EXE">File21</File>
</Files>
<Files>
<File Type="DLL">File22</File>
<File Type="None">File23</File>
<File Type="EXE">File24</File>
</Files>
<Files>
<File Type="DLL">File25</File>
<File Type="None">File26</File>
<File Type="EXE">File27</File>
</Files>
</Directory>
</Directories>
这是我的 class:
[XmlRoot("Directories")]
public class Directories
{
[XmlElement("Directory")]
public Directory[] Directory { get; set; }
}
public class Directory
{
[XmlAttribute("Path")]
public string Path { get; set; }
[XmlArray("Files")]
[XmlArrayItem("File")]//this causes the object to structure properly, but doesn't populate the string file property in the class with or without the attribute decoration
public XmlFileInfo[] Files { get; set; }
}
public class XmlFileInfo
{
[XmlElement("File")]
public string File { get; set; }
[XmlAttribute("Type")]//this works fine if this class is referenced as an array
public /*External Enum*/ FileTypes Type { get; set; }
}
上面的 class 装饰正确地填充了 Type 枚举,但没有填充 File 字符串。以下带有装饰的 class 使用文件树中的第一个文件填充文件字符串,并且没有正确填充类型枚举
[XmlRoot("Directories")]
public class Directories
{
[XmlElement("Directory")]
public Directory[] Directory { get; set; }
}
public class Directory
{
[XmlAttribute("Path")]
public string Path { get; set; }
[XmlElement("Files")]
//[XmlArrayItem("File")]
public XmlFileInfo[] Files { get; set; }
}
public class XmlFileInfo
{
[XmlElement("File")]
public string File { get; set; }
[XmlAttribute("Type")]
public SignatureChecker_Mtabs.Program.FileTypes Type { get; set; }
}
我错过了什么?
我修改了 class。我的问题是我的 xmlFileInfo 的属性。我设计的 class 不正确,由于时间限制,我无法更正它。所以我要删除属性并使用这个 class
[Serializable]
//[XmlRoot("Directories")]
public class Directories
{
//[XmlElement("Directory")]
public List<Directory> Directory { get; set; }
}
[Serializable]
public class Directory
{
//[XmlAttribute()]
public string Path { get; set; }
//[XmlArray("Files")]
//[XmlArrayItem("File")]
public List<XmlFileInfo> Files { get; set; }
}
[Serializable]
public class XmlFileInfo
{
//[XmlElement("File")]
public string File { get; set; }
//[XmlAttribute()]
public MyobstruficatedEnum Type { get; set; }
}
我一直在尝试将 xml 文档反序列化为 class。我以前做过,但没有这么多嵌套。我非常想复制一个简单的目录树。我 运行 遇到的问题是文件方面。目录部分有效,我可以访问文件,但是将文件名反序列化为我的 class 并不完全匹配。我的 XMl 文档是:
<?xml version="1.0" encoding="utf-8"?>
<Directories>
<Directory Path="Path1">
<Files>
<File Type="None">File1</File>
<File Type="None">File2</File>
<File Type="EXE">File3</File>
</Files>
<Files>
<File Type="DLL">File4</File>
<File Type="None">File5</File>
<File Type="EXE">File6</File>
</Files>
<Files>
<File Type="DLL">File7</File>
<File Type="None">File8</File>
<File Type="EXE">File9</File>
</Files>
</Directory>
<Directory Path="Path2">
<Files>
<File Type="DLL">File10</File>
<File Type="None">File11</File>
<File Type="EXE">File12</File>
</Files>
<Files>
<File Type="DLL">File13</File>
<File Type="None">File14</File>
<File Type="EXE">File15</File>
</Files>
<Files>
<File Type="DLL">File16</File>
<File Type="None">File17</File>
<File Type="EXE">File18</File>
</Files>
</Directory>
<Directory Path="Path3">
<Files>
<File Type="DLL">File19</File>
<File Type="None">File20</File>
<File Type="EXE">File21</File>
</Files>
<Files>
<File Type="DLL">File22</File>
<File Type="None">File23</File>
<File Type="EXE">File24</File>
</Files>
<Files>
<File Type="DLL">File25</File>
<File Type="None">File26</File>
<File Type="EXE">File27</File>
</Files>
</Directory>
</Directories>
这是我的 class:
[XmlRoot("Directories")]
public class Directories
{
[XmlElement("Directory")]
public Directory[] Directory { get; set; }
}
public class Directory
{
[XmlAttribute("Path")]
public string Path { get; set; }
[XmlArray("Files")]
[XmlArrayItem("File")]//this causes the object to structure properly, but doesn't populate the string file property in the class with or without the attribute decoration
public XmlFileInfo[] Files { get; set; }
}
public class XmlFileInfo
{
[XmlElement("File")]
public string File { get; set; }
[XmlAttribute("Type")]//this works fine if this class is referenced as an array
public /*External Enum*/ FileTypes Type { get; set; }
}
上面的 class 装饰正确地填充了 Type 枚举,但没有填充 File 字符串。以下带有装饰的 class 使用文件树中的第一个文件填充文件字符串,并且没有正确填充类型枚举
[XmlRoot("Directories")]
public class Directories
{
[XmlElement("Directory")]
public Directory[] Directory { get; set; }
}
public class Directory
{
[XmlAttribute("Path")]
public string Path { get; set; }
[XmlElement("Files")]
//[XmlArrayItem("File")]
public XmlFileInfo[] Files { get; set; }
}
public class XmlFileInfo
{
[XmlElement("File")]
public string File { get; set; }
[XmlAttribute("Type")]
public SignatureChecker_Mtabs.Program.FileTypes Type { get; set; }
}
我错过了什么?
我修改了 class。我的问题是我的 xmlFileInfo 的属性。我设计的 class 不正确,由于时间限制,我无法更正它。所以我要删除属性并使用这个 class
[Serializable]
//[XmlRoot("Directories")]
public class Directories
{
//[XmlElement("Directory")]
public List<Directory> Directory { get; set; }
}
[Serializable]
public class Directory
{
//[XmlAttribute()]
public string Path { get; set; }
//[XmlArray("Files")]
//[XmlArrayItem("File")]
public List<XmlFileInfo> Files { get; set; }
}
[Serializable]
public class XmlFileInfo
{
//[XmlElement("File")]
public string File { get; set; }
//[XmlAttribute()]
public MyobstruficatedEnum Type { get; set; }
}