在 xml treeview C# 中创建 child 节点到当前节点
Creating child node to the current node in xml treeview C#
我有两个 XML
文件,然后在 Visual studio C# 中以 treeview
格式显示。在 treeviews
中,根和第一个 child 是相同的。让其显示为:
root
child1
children1
children1
children1
children1
children1
对于第二个树视图,我有:
root
child1
children2
children2
children2
children2
children2
现在我在级别 children
中比较两个树视图。如果它们的名称相同,那么我将保留它们,否则我想创建一个虚拟 node/children 但不知道如何创建。我写了这段代码,但它添加到 root
节点而不是添加到 child
节点
XmlDocument docXml1 = new XmlDocument();
docXml1.Load(xmlfile1);
XmlDocument docXml2 = new XmlDocument();
docXml2.Load(xmlfile2);
XmlNodeList actions1 = root1.SelectNodes("/root/child1/children1");
XmlNodeList actions2 = root2.SelectNodes("/root/child1/children2");
if (Name_of_children1 != Name_of_children2)
{
var VirtualNode = "";
treeView1.Nodes.Add(VirtualNode.Trim());
}
当然很多代码行被删除以使其简短。
这是关于如何操作的完整示例:
TestForm.cs:
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
this.Load += Test_Load;
}
private void Test_Load(object sender, EventArgs e)
{
try
{
XmlDocument doc1 = new XmlDocument();
doc1.Load("file1.xml");
XmlDocument doc2 = new XmlDocument();
doc2.Load("file2.xml");
trvLeft.Nodes.Clear();
trvRight.Nodes.Clear();
trvLeft.Nodes.Add(new TreeNode("File 1"));
trvRight.Nodes.Add(new TreeNode("File 2"));
TreeNode tlNode = new TreeNode();
TreeNode trNode = new TreeNode();
tlNode = trvLeft.Nodes[0];
trNode = trvRight.Nodes[0];
AddNode(doc1.DocumentElement, doc2.DocumentElement, tlNode, trNode);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
var childrensLeft = trvLeft.Nodes[0].Nodes[0].Nodes;
var childrensRight = trvRight.Nodes[0].Nodes[0].Nodes;
for (int i = 0; i < Math.Min(childrensLeft.Count, childrensRight.Count); i++)
{
if (childrensRight[i].Text != childrensLeft[i].Text)
{
//childrensLeft[i].ForeColor = Color.Red;
//childrensRight[i].ForeColor = Color.Red;
childrensLeft[i].Nodes.Add("Something to left");
childrensRight[i].Nodes.Add("Something to right");
}
}
trvLeft.ExpandAll();
trvRight.ExpandAll();
}
private void AddNode(XmlNode leftXmlNode, XmlNode rightXmlNode, TreeNode leftNode, TreeNode rightNode)
{
//XmlNode xNode;
TreeNode tlNode;
TreeNode trNode;
XmlNodeList lnodeList;
XmlNodeList rnodeList;
int i;
if (leftXmlNode.HasChildNodes && rightXmlNode.HasChildNodes)
{
lnodeList = leftXmlNode.ChildNodes;
rnodeList = rightXmlNode.ChildNodes;
for (i = 0; i <= Math.Min(lnodeList.Count, rnodeList.Count) - 1; i++)
{
var lNode = leftXmlNode.ChildNodes[i];
var rNode = rightXmlNode.ChildNodes[i];
leftNode.Nodes.Add(new TreeNode(lNode.Name));
tlNode = leftNode.Nodes[i];
rightNode.Nodes.Add(new TreeNode(rNode.Name));
trNode = rightNode.Nodes[i];
AddNode(lNode, rNode, tlNode, trNode);
}
}
else
{
leftNode.Text = (leftXmlNode.OuterXml).Trim();
rightNode.Text = (rightXmlNode.OuterXml).Trim();
}
}
}
file1.xml
<root>
<child1>
<children1/>
<children1/>
<children1/>
<children1/>
<children1/>
<children1/>
</child1>
</root>
file2.xml
<root>
<child1>
<children1/>
<children2/>
<children1/>
<children1/>
<children1/>
<children1/>
</child1>
</root>
结果:
我有两个 XML
文件,然后在 Visual studio C# 中以 treeview
格式显示。在 treeviews
中,根和第一个 child 是相同的。让其显示为:
root
child1
children1
children1
children1
children1
children1
对于第二个树视图,我有:
root
child1
children2
children2
children2
children2
children2
现在我在级别 children
中比较两个树视图。如果它们的名称相同,那么我将保留它们,否则我想创建一个虚拟 node/children 但不知道如何创建。我写了这段代码,但它添加到 root
节点而不是添加到 child
节点
XmlDocument docXml1 = new XmlDocument();
docXml1.Load(xmlfile1);
XmlDocument docXml2 = new XmlDocument();
docXml2.Load(xmlfile2);
XmlNodeList actions1 = root1.SelectNodes("/root/child1/children1");
XmlNodeList actions2 = root2.SelectNodes("/root/child1/children2");
if (Name_of_children1 != Name_of_children2)
{
var VirtualNode = "";
treeView1.Nodes.Add(VirtualNode.Trim());
}
当然很多代码行被删除以使其简短。
这是关于如何操作的完整示例:
TestForm.cs:
public partial class TestForm : Form
{
public TestForm()
{
InitializeComponent();
this.Load += Test_Load;
}
private void Test_Load(object sender, EventArgs e)
{
try
{
XmlDocument doc1 = new XmlDocument();
doc1.Load("file1.xml");
XmlDocument doc2 = new XmlDocument();
doc2.Load("file2.xml");
trvLeft.Nodes.Clear();
trvRight.Nodes.Clear();
trvLeft.Nodes.Add(new TreeNode("File 1"));
trvRight.Nodes.Add(new TreeNode("File 2"));
TreeNode tlNode = new TreeNode();
TreeNode trNode = new TreeNode();
tlNode = trvLeft.Nodes[0];
trNode = trvRight.Nodes[0];
AddNode(doc1.DocumentElement, doc2.DocumentElement, tlNode, trNode);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
var childrensLeft = trvLeft.Nodes[0].Nodes[0].Nodes;
var childrensRight = trvRight.Nodes[0].Nodes[0].Nodes;
for (int i = 0; i < Math.Min(childrensLeft.Count, childrensRight.Count); i++)
{
if (childrensRight[i].Text != childrensLeft[i].Text)
{
//childrensLeft[i].ForeColor = Color.Red;
//childrensRight[i].ForeColor = Color.Red;
childrensLeft[i].Nodes.Add("Something to left");
childrensRight[i].Nodes.Add("Something to right");
}
}
trvLeft.ExpandAll();
trvRight.ExpandAll();
}
private void AddNode(XmlNode leftXmlNode, XmlNode rightXmlNode, TreeNode leftNode, TreeNode rightNode)
{
//XmlNode xNode;
TreeNode tlNode;
TreeNode trNode;
XmlNodeList lnodeList;
XmlNodeList rnodeList;
int i;
if (leftXmlNode.HasChildNodes && rightXmlNode.HasChildNodes)
{
lnodeList = leftXmlNode.ChildNodes;
rnodeList = rightXmlNode.ChildNodes;
for (i = 0; i <= Math.Min(lnodeList.Count, rnodeList.Count) - 1; i++)
{
var lNode = leftXmlNode.ChildNodes[i];
var rNode = rightXmlNode.ChildNodes[i];
leftNode.Nodes.Add(new TreeNode(lNode.Name));
tlNode = leftNode.Nodes[i];
rightNode.Nodes.Add(new TreeNode(rNode.Name));
trNode = rightNode.Nodes[i];
AddNode(lNode, rNode, tlNode, trNode);
}
}
else
{
leftNode.Text = (leftXmlNode.OuterXml).Trim();
rightNode.Text = (rightXmlNode.OuterXml).Trim();
}
}
}
file1.xml
<root>
<child1>
<children1/>
<children1/>
<children1/>
<children1/>
<children1/>
<children1/>
</child1>
</root>
file2.xml
<root>
<child1>
<children1/>
<children2/>
<children1/>
<children1/>
<children1/>
<children1/>
</child1>
</root>
结果: