在 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>

结果: