我想创建一个类似于以下
的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)));
答案 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);