1

次のようなディレクトリ構造の XMLDom を作成したい

<ROOT>
 <NAME>MainFolder</NAME>
 <Path>C:\MainFolder</Path>
 <Level1>
 <Name>Folder 1</Name>
 <Path>C:\MainFolder\Folder 1</Path>
 <Level2>
  <Name>Folder 1 1</Name>
  <Path>C:\MainFolder\Folder 1\Folder 1 1</Path>
 </Level2>
 <Level2>
  <Name>Folder 1 2</Name>
  <Path>C:\MainFolder\Folder 1\Folder 1 2</Path>
 </Level2>
 </Level1>
</ROOT>

私がやろうとしていることが機能する場合は使用しませんが、以下のコードでは、不正な文字を入力しようとしているというエラーが表示されます

private static XElement DirToXml(DirectoryInfo dir ,int level)
        {
            string slevel;
            switch (level)
            {
                case 1:
                    slevel = "Level1";
                    break;
                case 2:
                    slevel = "Level2";
                    break;
                case 3:
                    slevel = "Level3";
                    break;
                default:
                    slevel = "SoOn";
                    break;
            }
            XElement mdoc = XElement.Load("<test></test>");
            foreach (var tdir in dir.GetDirectories())
            {
                XElement doc = XElement.Load("<" + slevel +"> \n <Name>" + dir.Name +"</Name>\n <Path>"+ dir.FullName +"</Path>\n </"+slevel+">");
                tdir.GetDirectories().Select(d => DirToXml(d, level++));
                mdoc.Add(doc);
            }

            return mdoc;
            //return new XElement("Level1", new XAttribute("Name", dir.Name), dir.GetDirectories().Select(d => DirToXml(d, level ++)));

        }

これは私が DirToXml を呼び出すために使用するものです

XDocument xdoc = new XDocument(
                    new XElement("Root", DirToXml(new DirectoryInfo(@"C:\MainFolder"), 0)));
4

1 に答える 1

3

XElement.Parse(("<test></test>");おそらく、 ではなくを呼び出すつもりでしXElement.Load("<test></test>");た。主なエラーは<test>、有効なファイル名 (の一部) ではないことです。

他のすべての文字と構文の問題を回避する方法はParse(somString)、適切な要素を使用せずに追加することです。

 //XElement doc = XElement.Load("<" + slevel +"> \n <Name>" +
 //      dir.Name +"</Name>\n <Path>"+ dir.FullName +"</Path>\n </"+slevel+">");

 XElement doc = new XElement(slevel, 
          new XElement("Name", dir.Name),
          new XElement("Path", dir.FullName) );

このようにして、および Path の (不正な) パス文字dir.Nameは自動的に XML エンコードされます。

そして、あなたの再帰的アプローチに関して、

// untested
XElement doc = ...;
var subs = tdir.GetDirectories().Select(d => DirToXml(d, level++));
foreach (var sub in subs)
   doc.Add(sub);
mdoc.Add(doc);
于 2012-10-17T11:49:18.753 に答える