2012-10-17 81 views
1

我想創建一個類似如下目錄創建的XDocument Stucture

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

我不使用目錄結構的XMLDOM如果我特林做的工作,但下面的代碼給出了一個錯誤說法我特林輸入非法字符

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

回答

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

這樣的(非法的)路徑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); 
+1

+1發送的OP正確的道路,感謝亨克! –

+0

謝謝,現在我只是得到它的工作遞歸,但我知道我可以做'dir.GetDirectories(「*」,System.IO.SearchOption.AllDirectories);'我知道這是問題的側面,但你知道嗎無論如何將輸出應用於XElement,但仍然有level元素標籤? –

+1

請參閱編輯。 @SamStephenson –