【发布时间】:2013-11-28 04:09:31
【问题描述】:
如何显示从 xml 文件到 wpf 树视图的文件夹结构?我已经尝试了 Josh Smith 的文章 http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewModel 的第二部分(区域),但是,如何扫描或显示包含未知级别数的文件夹结构的 xml 文件?
下面是我想在 wpf 树视图中显示的 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>
附: 以下是我不成功的尝试。我正在尝试将 xml 文件内容保存到列表中,以使用 mvvm 模式绑定到我的 wpf 树视图。
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;
}
}
【问题讨论】:
-
您是否已经将 XML 文件读入了某种数据结构(如果有,请出示代码)?或者,阅读 XML 文件是您的实际问题吗?
-
@elgonzo 读取 XML 文件是我的实际问题。
-
好的,还有一些问题 :) 您需要 XML 文件中的信息仅用于 TreeView,还是您的软件中的其他地方也需要 XML 数据? TreeView 是否只显示 XML 中的文本,还是 XML 包含一些对 TreeViewItems 的可视化有影响的属性/元素?
-
@elgonzo 我只需要用于树视图的 xml 数据,并且 xml 文件可能包含一些对 TreeViewItems 的可视化有影响的属性。
-
是否使用子元素而不是属性取决于您的需求。经验法则:将您的 XML 格式设计为尽可能简洁、易读和明确。这通常意味着使用诸如“姓名”、“日期”等信息的属性是更好的方法。但是,仅从软件的角度来看(a-ka Linq 查询),这两种方法之间没有显着差异......