0

我有一个这样的xml文件:

<servers>
<general name="1">      
        <service name="ser1"/>
        <service name="ser2"/>  
</general>
<general name="2">      
        <service name="ser1"/>
        <service name="ser2"/>  
</general>
</servers>

在我的 winform 应用程序中,我有一个复选框属性设置为 true 的树视图列表。我想要实现的是我试图读取这个 xml 文件并将父节点和子节点都更新到这个树视图。

我尝试过的是:

XDocument doc = XDocument.Load(@"D:\\path.xml");
        TreeNode node;            
            var gnrl = from general in doc.Descendants("general")
                       select new
                       {
                           parent = general.Attribute("name").Value,
                           child = general.Descendants("service")
                       };
            //Loop through results
            foreach (var general in gnrl)
            {
                 // Add a root node.
            node = dcselectview.Nodes.Add(String.Format(general.parent));
                foreach (var ser in general.child)
                {
                        // Add a node as a child of the previously added node.
                        node = node.Nodes.Add(String.Format(ser.Attribute("name").Value));                        
                }
           }

它读取文件并更新所有详细信息,但方式不正确。而是如下所示:

在此处输入图像描述

需要:

我希望父元素位于子元素的顶部和右侧。如果可能的话,如果我没有父元素的复选框,那就太好了。

任何帮助将非常感激..

编辑:

我的代码已编辑。现在我得到如下新图片所示:

在此处输入图像描述

我希望 2 条黑线在同一行,而不是作为另一个的子节点..

4

5 回答 5

0

你想要这样的层次结构吗?

在此处输入图像描述

如果是这样,我建议您查看 Treeview:http: //msdn.microsoft.com/en-us/library/system.windows.forms.treeview.checkboxes.aspx

于 2013-10-07T09:38:53.263 回答
0

您必须先将父节点添加为节点

public static bool LoadNodesFromXML()
    {
        XDocument doc = XDocument.Load(@"D:\\path.xml");
        var root = doc.Root;
        var childenode = dcselectview.Nodes.Add(root.Attribute("Name").Value);
        foreach (var xElement in root .Elements())
                {
                    InsertNode(childenode, xElement);
                }
}


private void InsertNode(TreeNode parent, XElement element)
        {
            var childenode = parent.Nodes.Add(element.Attribute("Name").Value);
            if(element.Elements().Count() > 0)
                foreach (var xElement in element.Elements())
                {
                    InsertNode(childenode, xElement);
                }

        }
于 2013-10-07T10:04:49.770 回答
0

试试这个你会得到

        XDocument doc = XDocument.Load(@"D:\\test.xml");

        IEnumerable<XElement> Xele = doc.XPathSelectElements("//general");

        foreach (XElement xe in Xele.Descendants())
        {
            //MessageBox.Show(xe.Attribute("name").Value);
        dcselectview.Parent.Text =xe.Parent.Attribute("name").Value; // here parent  value ---->  name="1" and name="2" 
        dcselectview.Nodes.Add(xe.Attribute("name").Value); // ser1     ser2        ser1        ser2
        }
于 2013-10-07T10:14:12.107 回答
0

试试这个:

public static class TreeViewExtension
{
    public static bool LoadNodesFromXML(this TreeView tv, string xml)
    {
        try
        {
            XDocument doc = XDocument.Parse(xml);
            TreeNode rootNode = new TreeNode();
            rootNode.Text = doc.Root.ToString().Split('>')[0] + ">";
            rootNode.LoadTreeNodes(doc.Root.Elements());
            tv.Nodes.Add(rootNode);
            return true;
        }
        catch { return false; }
    }
    public static void LoadTreeNodes(this TreeNode parentNode, IEnumerable<XElement> elements)
    {
        foreach (var e in elements) {
            TreeNode childNode = new TreeNode();                
            childNode.Text = e.ToString().Split('>')[0] + ">";
            parentNode.Nodes.Add(childNode);
            childNode.LoadTreeNodes(e.Elements());
        }
    }
}
//Usage:
var yourInputXMLString = "<servers><general name=\"1\"><service name=\"ser1\"/>" +
                         "<service name=\"ser2\"/></general><general name=\"2\">" +
                         "<service name=\"ser1\"/><service name=\"ser2\"/>" +
                         "</general></servers>";
treeView1.LoadNodesFromXML(yourInputXMLString);

在此处输入图像描述

于 2013-10-07T10:15:17.453 回答
0

谢谢大家的帮助::但我找到了我自己的另一个解决方案::

XDocument doc = XDocument.Load(@"path\\test.xml");            

        // Add nodes to treeView1.
        TreeNode pnode;
        TreeNode cnode;
            var gnrl = from general in doc.Descendants("general")
                       select new
                       {
                           parent = general.Attribute("name").Value,
                           child = general.Descendants("service")
                       };
            //Loop through results
            foreach (var general in gnrl)
            {
                 // Add a root node.
            pnode = treeview.Nodes.Add(String.Format(general.parent));
                foreach (var ser in general.child)
                {
                // Add a node as a child of the previously added node.
                cnode = pnode.Nodes.Add(String.Format(ser.Attribute("name").Value));                        
                }
           }
于 2013-10-07T11:33:01.180 回答