xmlファイルからwpfツリービューまでフォルダ構造を表示するには? Josh Smith の記事http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewModelの 2 番目の部分 (リージョン) を試しましたが、xml をスキャンまたは表示する方法不明なレベル数のフォルダ構造を含むファイル?
以下は、wpf treeview に表示したい xml ファイルです。名前を要素ではなく属性にすることはより良い方法ですか?
<?xml version="1.0" encoding="utf-8"?>
<Folder>
<Folders />
<FolderName>
<dir>
<name>RootDir</name>
<file>
<name>dobatchfile.bat</name>
</file>
<dir>
<name>Build</name>
<dir>
<name>BuildProcessTemplates</name>
<file>
<name>AzureContinuousDeployment.11.xaml</name>
</file>
<file>
<name>DefaultTemplate.11.1.xaml</name>
</file>
</dir>
</dir>
</dir>
</FolderName>
</Folder>
PS以下は私の失敗した試みです。mvvm パターンを使用して wpf ツリービューにバインドするために、xml ファイルの内容をリストに保存しようとしています。
public static List<Directory> GetRegions()
{
List<Directory> ret = new List<Directory>();
//var expandolist = GetExpandoFromXml("C:\\New folder/Region1.xml", "Regions", "");
var expandolist = GetExpandoFromXmlRoot("c:\\temp/SerializationOverview.xml", "Regions", "");
expandolist.ToList().ForEach(element =>
{
var dictionary = element as IDictionary<string, object>;
// dictionary.ToList().ForEach(d => ret.Add(new Directory(d.Key)));
dictionary.Where(d => d.Key == "name" || d.Key == "dir").ToList().ForEach(d => ret.Add(new Directory(d.Value.ToString())));
});
return ret;
}
public static IEnumerable<dynamic> GetExpandoFromXml(string file, string descendantid, string Selection)
{
var expandoFromXml = new List<dynamic>();
var doc = XDocument.Load(file);
//foreach (var element in doc.Root.Descendants(descendantid))
foreach (var element in doc.Root.Descendants())
{
dynamic expandoObject = new ExpandoObject();
var dictionary = expandoObject as IDictionary<string, object>;
foreach (var child in element.Elements().Where(e => e.Parent.Parent.Value.Contains(Selection)))
//foreach (var child in element.Descendants())
{
if (child.Name.Namespace == "")
dictionary[child.Name.ToString()] = child.Value.Trim();
// dictionary[child.Name.ToString()] = child.Attributes().FirstOrDefault().Value;
}
yield return expandoObject;
}
}