在不知道级别数量的情况下生成多级自定义类型(文件夹结构)
本文关键字:类型 自定义 多级 文件夹 结构 不知道 情况下 | 更新日期: 2023-09-27 18:21:16
我正在尝试基于EDMS的文件夹结构构建一个类型。我需要查询的tbl结构如下ParentIdChildId
所以我不知道家里每个文件夹结构有多少层。
所以我的问题是,如果我创建了一个类/类型,我该怎么做
using System;
using System.Xml.Serialization;
using System.Collections.Generic;
namespace DocumentMigrator
{
[XmlRoot(ElementName = "DocuShareFolders")]
class objFolderStructure
{
[XmlElement(ElementName = "RootElement")]
public RootElement RootElement { get; set; }
}
[XmlRoot(ElementName = "RootElement")]
public class RootElement
{
[XmlElement(ElementName = "iRootElementId")]
public string IRootElementId { get; set; }
[XmlElement(ElementName = "sRootElementName")]
public string SRootElementName { get; set; }
[XmlElement(ElementName = "sRootElementDescription")]
public string SRootElementDescription { get; set; }
[XmlElement(ElementName = "Folder")]
public Folder Folder { get; set; }
}
[XmlRoot(ElementName = "Folder")]
public class Folder
{
[XmlElement(ElementName = "iFolderId")]
public string IFolderId { get; set; }
[XmlElement(ElementName = "sFolderDescription")]
public string SFolderDescription { get; set; }
[XmlElement(ElementName = "sFolderName")]
public string SFolderName { get; set; }
}
}
我的问题是,我如何处理文件夹中的子文件夹,以及可能处于任何级别的文件?
提前感谢
要让一个文件夹包含多个子文件夹,这就是您想要的。
[XmlArrayItem(ElementName = "Folder")]
public List<Folder> ChildFolders { get; set; }
您所需要做的就是用所有子文件夹填充文件夹列表。
您可能还想更改这个的根元素
[XmlRoot(ElementName = "RootElement")]
public class RootElement
{
[XmlElement(ElementName = "iRootElementId")]
public string IRootElementId { get; set; }
[XmlElement(ElementName = "sRootElementName")]
public string SRootElementName { get; set; }
[XmlElement(ElementName = "sRootElementDescription")]
public string SRootElementDescription { get; set; }
[XmlElement(ElementName = "Folder")]
public Folder Folder { get; set; }
}
到这个
[XmlRoot(ElementName = "RootElement")]
public class RootElement
{
[XmlElement(ElementName = "iRootElementId")]
public string IRootElementId { get; set; }
[XmlElement(ElementName = "sRootElementName")]
public string SRootElementName { get; set; }
[XmlElement(ElementName = "sRootElementDescription")]
public string SRootElementDescription { get; set; }
[XmlArrayItem(ElementName = "Folder")]
public List<Folder> Folders { get; set; }
}
以便根元素可以有多个同级文件夹
你可以在控制台应用程序中尝试这段代码来测试它
objFolderStructure structure = new objFolderStructure();
structure.RootElement = new RootElement();
structure.RootElement.Folders = new List<Folder>()
{
new Folder()
{
ChildFolders = new List<Folder>()
{
new Folder() { SFolderName = "blah" }
},
SFolderName = "some folder"
},
new Folder()
{
ChildFolders = new List<Folder>()
{
new Folder() { SFolderName = "blah 2" },
new Folder() { SFolderName = "blah 2 2" },
new Folder() { SFolderName = "blah 3" }
},
SFolderName = "some folder 2"
}
};
new XmlSerializer(typeof(objFolderStructure)).Serialize(Console.Out, structure);
您最终应该在根级别上有2个文件夹,第一个文件夹有1个子文件夹,第二个文件夹有3个子文件夹。
这不是一个完整的复制/粘贴答案,但旨在显示您正在寻找的构造。我从谷歌Kml格式的包装器中复制/编辑了这篇文章,该格式包含一个模拟嵌套文件夹的想法。文件夹可以(除其他外)包含(子)文件夹或占位符(地图上的点)。
要查看的具体构造是在File和Folder(AbstractItem)之间使用共享基类,并结合使用XmlElement属性。
请注意,在生成的Xml中,您将从XmlElement("File"answers"Folder")标记和而不是"Items"中找到指定的名称
public class Folder : AbstractItem
{
[XmlElement("File", Type = typeof(File))]
[XmlElement("Folder", Type = typeof(Folder))]
public List<AbstractItem> Items { get; set; }
}
public class File : AbstractItem
{
// Empty
}
public abstract class AbstractItem {
[XmlElement("name")]
public string Name { get; set; }
}