我有一个看起来像这样的平面文件:
.root:NODE
.root.branch1:NODE
.root.branch1.size:INT
.root.branch1.name:STRING
.root.branch2:NODE
.root.branch2.flavor:NODE
.root.branch2.flavor.cost:INT
.root.branch2.flavor.name:STRING
文件内容,深度,长度等每次都会有所不同,所以我不能硬编码任何东西(尽管节点总是数据类型'NODE')。我需要将它作为数据源引入C#。我不确定解析文件的最佳方法是将其转换为看起来像
的结构+root
+branch1
size:
name:
+branch2
+flavor
cost:
name:
等。理想情况下,我想动态构建一个树视图控件,用户可以使用它来选择他想要访问的节点(这些标签是实际数据源的路径;所以代码中的其他地方,我正在使用)
int iVal = somefunction.readvar(".root.branch2.flavor.cost");
/ edit /如果有帮助,我正在尝试解析的文件是由TwinCat 2程序生成的* .SYM文件(符号文件)。这里有一些文档:http://infosys.beckhoff.com/content/1033/tcplccontrol/html/tcplcctrl_componentsoptions.htm#Symbol%20configuration
答案 0 :(得分:0)
C#:
private void AddToTreeView()
{
TreeViewItem root = new TreeViewItem();
foreach (string line in ReadLines())
{
var parts = line.Split(new char[] { '.' },StringSplitOptions.RemoveEmptyEntries);
if (parts.Length == 1)
{
root.Header = parts[0].Split(':')[0];
root.Tag = line;
}
else
{
TreeViewItem node = root;
foreach (var part in parts)
{
var header = part.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries)[0];
if(!IfExists(node, header, ref node))
{
node.Items.Add(new TreeViewItem()
{
Header = header,
Tag = line
});
node = root;
}
}
}
}
treeView.Items.Add(root);
}
private bool IfExists(TreeViewItem itm, string header, ref TreeViewItem which)
{
if (itm.Header as string == header)
{
which = itm;
return true;
}
foreach (TreeViewItem i in itm.Items)
{
if (i.Header as string == header)
{
which = i;
return true;
}
else if (i.HasItems)
{
if (IfExists(i, header, ref which))
return true;
}
}
return false;
}
XAML:
<TreeView x:Name="treeView" Height="100">
</TreeView>
截图:
嗯,这段代码有效但是,它可能有一些缺陷,并不是一个完美的解决方案。无论如何,即使它不能很好地工作,它也应该在某些方面帮助你。
编辑: 这样,它有时不起作用,例如如果没有订购节点。
我改变了程序的这一部分,因此它不再有其他错误了。
if (!IfExists(node, header, ref node))
{
var currNode = new TreeViewItem()
{
Header = header,
Tag = line
};
node.Items.Add(currNode);
if (part.Contains(":"))
node = root;
else
node = currNode;
}
如果输入为:
,则前面的代码输出.root:NODE
.root.branch1:NODE
.root.branch2.flavor.name:STRING
.root.branch1.size:INT
.root.branch1.name:STRING
.root.branch2:NODE
.root.branch2.flavor:NODE
.root.branch2.flavor.cost:INT
但是使用更改后的代码,它会尽可能地提供输出!