1

ファイルを含むディレクトリとファイルを含むサブディレクトリがあり、それらから 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\

そして、この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>

次のコンソール アプリを作成しましたが、2 つの問題があります。

  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;

    }

ここに画像の説明を入力

4

3 に答える 3

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;

    }
于 2013-04-12T21:43:50.127 に答える
2

サブディレクトリを処理するメソッドをもう 1 つ追加できます

private static XElement CreateXML(DirectoryInfo dir)
    {
        var xmlInfo = new XElement("serverfiles");
        //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(CreateSubdirectoryXML(subDir));
        }
        return xmlInfo;
    }

    private static XElement CreateSubdirectoryXML(DirectoryInfo dir)
    {
        //get directories
        var xmlInfo = new XElement("folder", 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(CreateSubdirectoryXML(subDir));
        }
        return xmlInfo;
    }

編集:

追加された並べ替え:

private static XElement CreateXML(DirectoryInfo dir)
        {
            var xmlInfo = new XElement("serverfiles");
            //get all the files first
            foreach (var file in dir.GetFiles())
            {
                xmlInfo.Add(new XElement("file", new XAttribute("name", file.Name)));
            }
            //get subdirectories
            var subdirectories = dir.GetDirectories().ToList().OrderBy(d => d.Name);
            foreach (var subDir in subdirectories)
            {
                xmlInfo.Add(CreateSubdirectoryXML(subDir));
            }
            return xmlInfo;
        }

        private static XElement CreateSubdirectoryXML(DirectoryInfo dir)
        {
            //get directories
            var xmlInfo = new XElement("folder", 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
            var subdirectories = dir.GetDirectories().ToList().OrderBy(d => d.Name);
            foreach (var subDir in subdirectories)
            {
                xmlInfo.Add(CreateSubdirectoryXML(subDir));
            }
            return xmlInfo;
        }
于 2013-04-12T21:51:04.213 に答える
0

私はこの解決策がより良いと思います

        //get directories
        var xmlInfo = new XElement("folder",                 
            new XElement("name", dir.Name),
            new XElement("lastModify", dir.LastWriteTime),
            new XElement("Attributes", dir.Attributes));

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

        //get all the files
        foreach (var file in dir.GetFiles())
        {
            xmlInfo.Add(new XElement("File",
                new XElement("name", file.Name),
                new XElement("size", file.Length),
                new XElement("lastModify", file.LastWriteTime),
                new XElement("Attributes", file.Attributes.ToString())));
        }
        return xmlInfo;
于 2013-08-28T10:20:47.043 に答える