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

时间:2015-11-09 14:33:24

标签: c#

我正在尝试根据EDMS的文件夹结构构建一个类型。我需要查询的tbl是结构为 的ParentId childID的

所以我不知道每个文件夹结构都有很多级别。

所以我的问题是,如果我创建一个类/类型,我该怎么做。我有这个

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; }

    }
}

我的问题是如何处理文件夹和文件中的子文件夹,这些文件夹可能处于任何级别?

提前谢谢

2 个答案:

答案 0 :(得分:0)

要获取包含多个子文件夹的文件夹,这就是您想要的。

[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个文件夹有1个子文件夹,第2个文件夹有3个子文件夹。

答案 1 :(得分:0)

这不是一个完整的复制/粘贴答案,但旨在显示您正在寻找的构造。我从包含simulair嵌套文件夹构思的google Kml格式的包装器中复制/编辑了这个。文件夹可以(以及其他)包含(子)文件夹或地标(地图上的点)。

要查看的特定构造是在文件和文件夹(AbstractItem)之间使用共享基类并结合使用XmlElement属性。

请注意,在生成的Xml中,您将从XmlElement(“文件”和“文件夹”)标记中找到指定的名称,而不是“项目”

    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; }    
}