从目录结构创建xml

Jam*_*mes 1 c# xml sorting directory

我有一个包含文件的目录和一个包含文件的子目录,并希望从中创建xml。这是我的文件夹结构:

C:\inputdata folder contains:
C:\inputdata\file1.txt
C:\inputdata\picture1.jpg
C:\inputdata\subfolder\picture2.jpg
C:\inputdata\subfolder\file2.txt
C:\inputdata\subfolder\anotherfolder \file3.txt
C:\inputdata\anotherfolder\
Run Code Online (Sandbox Code Playgroud)

我想生成这个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<serverfiles>
     <file name="picture1.jpg"/>
     <file name="file1.txt"/>
     <folder name="subfolder">
          <file name="picture2.jpg"/>
          <file name="file2.txt"/>
          <folder name="anotherfolder">
               <file name="file3.txt"/>
          </folder>
     </folder>
     <folder name="anotherfolder">
     </folder>
</serverfiles>
Run Code Online (Sandbox Code Playgroud)

我已经编写了以下控制台应用程序,但是有两个问题。

  1. 这将产生附加的屏幕快照xml,就结构而言,它与上述xml并不完全相同。

  2. 有没有一种方法可以对我的代码的name属性进行排序。

有人可以指出正确的方向吗?

    private const string folderLocation = @"c:\inputdata";
    static void Main(string[] args)
    {
        DirectoryInfo dir = new DirectoryInfo(folderLocation);


        var doc = new XDocument(CREATEXML(dir));

        Console.WriteLine(doc.ToString());

        Console.Read();
    }

  private static XElement CREATEXML(DirectoryInfo dir)
    {
        //get directories
        var xmlInfo = new XElement("serverfiles", new XAttribute("name", dir.Name));

        //get all the files first
        foreach(var file in dir.GetFiles())
        {
            xmlInfo.Add(new XElement("file", new XAttribute("name", file.Name)));
        }

        //get subdirectories
        foreach(var subDir in dir.GetDirectories())
        {
            xmlInfo.Add(CREATEXML(subDir));
        }

        return xmlInfo;

    }
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

It'*_*ie. 5

几乎在那儿:您只需要对代码进行一些小的编辑。

    private const string folderLocation = @"c:\inputdata";
    static void Main(string[] args)
    {
        DirectoryInfo dir = new DirectoryInfo(folderLocation);

        // makes everything wrapped in an XElement called serverfiles.
        // Also a declaration as specified (sorry about the standalone status:
        // it's required in the XDeclaration constructor)    
        var doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"),
             CREATEXML(dir));

        Console.WriteLine(doc.ToString());

        Console.Read();
    }

  private static XElement CREATEXML(DirectoryInfo dir, bool writingServerFiles = true)
    {
        //get directories
        var xmlInfo = new XElement(writingServerFiles ? "serverfiles" : "folder", writingServerFiles ? null : new XAttribute("name", dir.Name)); //fixes your small isue (making the root serverfiles and the rest folder, and serverfiles not having a name XAttribute)

        //get all the files first
        foreach(var file in dir.GetFiles())
        {
            xmlInfo.Add(new XElement("file", new XAttribute("name", file.Name)));
        }
            //get subdirectories
        foreach(var subDir in dir.GetDirectories())
        {
            xmlInfo.Add(CREATEXML(subDir), false);
        }
        return xmlInfo;

    }
Run Code Online (Sandbox Code Playgroud)