Reputation: 5190
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)));
Upvotes: 1
Views: 258
Reputation: 273564
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);
Upvotes: 3