在不知道级别数量的情况下生成多级自定义类型(文件夹结构)

本文关键字:类型 自定义 多级 文件夹 结构 不知道 情况下 | 更新日期: 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; }    
}