创建目录结构的XDocument

时间:2012-10-17 11:41:45

标签: c# xml linq-to-xml directoryinfo xmldom

我想创建一个类似于以下

的Directory结构的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)));

1 个答案:

答案 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和Path中的(非法)路径字符将自动进行XML编码。

关于你的递归方法,

// untested
XElement doc = ...;
var subs = tdir.GetDirectories().Select(d => DirToXml(d, level++));
foreach (var sub in subs)
   doc.Add(sub);
mdoc.Add(doc);