Pergunta

I want to create a XMLDom of a Directory structure that looks like the following

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

I not to use if what I tring to do will work but the code below gives an error saying I tring to input illegal characters

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

        }

this is what I use to call DirToXml

XDocument xdoc = new XDocument(
                    new XElement("Root", DirToXml(new DirectoryInfo(@"C:\MainFolder"), 0)));
Foi útil?

Solução

You probably meant to call XElement.Parse(("<test></test>"); , not XElement.Load("<test></test>");. Your main error would be that <test> is not (part of) a valid filename.

The way to avoid all other char and syntax issues is to not use Parse(somString) but add proper elements:

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

This way the (illegal) path characters in dir.Name and Path will automatically be XML-encoded.

And regarding your recursive approach,

// untested
XElement doc = ...;
var subs = tdir.GetDirectories().Select(d => DirToXml(d, level++));
foreach (var sub in subs)
   doc.Add(sub);
mdoc.Add(doc);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top