📄 tree.cs
字号:
using System;
using System.Windows.Forms;
using System.Xml;
using System.Text;
using System.Globalization;
using System.IO;
using System.Text.RegularExpressions;
namespace CmmInterpretor
{
public class Tree
{
//将树保存成XML文件
internal XmlDocument Tree2XML(ref TreeView treeView)
{
StringBuilder strOutput = new StringBuilder();
strOutput.Append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
strOutput.Append("<GrammerTree>\n");
WalkTreeNodes(treeView.Nodes, ref strOutput);
strOutput.Append("</GrammerTree>");
XmlDocument xmlDoc = new XmlDocument();
try
{
xmlDoc.LoadXml(strOutput.ToString());
}
catch (XmlException excp)
{
MessageBox.Show("无法保存XML文件");
return null;
}
return xmlDoc;
}
//遍历各节点
private void WalkTreeNodes(TreeNodeCollection nodeCol, ref System.Text.StringBuilder strOut)
{
foreach (TreeNode node in nodeCol)
{
string nodeText = node.Text;
if (nodeText.Contains("<") || nodeText.Contains("&"))
{
nodeText = Regex.Replace(nodeText, @"<", "<").ToString();
nodeText = Regex.Replace(nodeText, @"&", "&").ToString();
}
strOut.Append("<node>\n");
strOut.Append("<text>"+nodeText+"</text>\n");
if (node.GetNodeCount(true) > 0)
{
WalkTreeNodes(node.Nodes, ref strOut);
}
strOut.Append("</node>\n");
}
}
//根据输入的XML还原语法树
internal void CreateTree(string str, TreeNodeCollection treeNodeCol)
{
XmlTextReader xtr = new XmlTextReader(new StringReader(str));
int LastDepth = -1;
int CurrentDepth = -1;
TreeNode node = null;
TreeNodeCollection nodeCol = null;
xtr.WhitespaceHandling = WhitespaceHandling.None;
while (xtr.Read())
{
if (xtr.NodeType == XmlNodeType.Element)
{
switch (xtr.Name)
{
case "node":
node = new TreeNode();
CurrentDepth = xtr.Depth;
if (LastDepth == -1) //根节点
{
nodeCol = treeNodeCol;
}
else if (CurrentDepth < LastDepth) //上一级
{
for (int i = 0; i < LastDepth - CurrentDepth; i++)
{
nodeCol = nodeCol[nodeCol.Count - 1].Parent.Parent.Nodes;
}
}
else if (CurrentDepth > LastDepth) // 下一级
{
for (int i = 0; i < CurrentDepth - LastDepth; i++)
{
nodeCol = nodeCol[nodeCol.Count - 1].Nodes;
}
}
xtr.MoveToElement();
LastDepth = xtr.Depth;
break;
case "text":
node.Text = xtr.ReadString();
nodeCol.Add(node);
break;
default:
break;
}
}
}
xtr.Close();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -