【问题标题】:Create XDocument of Directory Stucture创建目录结构的 XDocument
【发布时间】:2012-10-17 11:41:44
【问题描述】:

我想创建一个如下所示的目录结构的 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)));

【问题讨论】:

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


    【解决方案1】:

    你可能是想打电话给XElement.Parse(("&lt;test&gt;&lt;/test&gt;");,而不是XElement.Load("&lt;test&gt;&lt;/test&gt;");。 您的主要错误是 &lt;test&gt; 不是(部分)有效文件名。

    避免所有其他字符和语法问题的方法是不使用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);
    

    【讨论】:

    • 谢谢,现在我只需要让它递归地工作,但是我知道我可以做到dir.GetDirectories("*", System.IO.SearchOption.AllDirectories); 我知道这不是问题,但你知道无论如何要将输出应用到 XElement 但仍然有关卡元素标签吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2010-11-26
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多