Search code examples
c#xmlcollectionstreeviewxmlreader

How I can control a XML with XMLReader to fill a TreeView with Subtree Nodes?


hi i have problems with xml and the treeview control in C# Windows Forms.

My Application:

  1. First I create a string out of a cmd command. This is a output in xml format. the final_output is my string for the XMLReader.

    string command = "\"C:\lmxendutil.exe\" -licstatxml -host lwserv005 -port 6200";

            string output = ExecuteCommand(command);
            string final_output = output.Substring(90, output.Length - 90);
    
  2. Second I use the XMLReader and StringReader for read this string and parse this in xml. than I make a collection with all Nodes with the name "FEATURE" with the attribute NAME="...".

    XmlReader xr = XmlReader.Create(new StringReader(final_output));

        while (xr.Read())
        {
            switch (xr.Name)
            {
                case "FEATURE":
                    if (xr.HasAttributes)
                    {
                        while (xr.MoveToNextAttribute())
                        {
                            if (xr.Name == "NAME")
                            {
                                liste.Add(xr.Value);
    
                            }
    
                        }
    
                    }
                  break;
            }
        }
    
  3. Now I show my list in the TreeView.

    TreeNode node;

            foreach (string x in liste)
            {
                node = new TreeNode(x);
                treeLic.Nodes.Add(node);
            }
    

The XML Structure is how this:

<FEATURE NAME="" VERSION="" .. >
  <USER NAME="" HOST="" ...>
  <USER NAME="" HOST="" ...>
  <USER NAME="" HOST="" ...>
<FEATURE NAME="" VERSION="" .. >
<FEATURE NAME="" VERSION="" .. >
<FEATURE NAME="" VERSION="" .. >
  <USER NAME="" HOST="" ...>
  <USER NAME="" HOST="" ...>
  <USER NAME="" HOST="" ...>

... 

I want to get this structure for my treeview with the value of attribute NAME for FEATURE and USER. My treeview show me only the FEATURE with NAME attribute Value. I try it with readsubtree but it don't work :(.

My Question is now...

How I can show alle nodes with the attribute NAME in the treeview and if I click oin a treeview node I can make a Event but how I can use this for show me more informations about the subtree node of the FEATURE node?

xml example:

<?xml version="1.0" encoding="UTF-8"?>
<LM-X STAT_VERSION="3.32">
<LICENSE_PATH TYPE="NETWORK" HOST="6200@serv005" SERVER_VERSION="4.4.4" UPTIME="53 day(s) 21 hour(s) 10 min(s) 50 sec(s)">
<FEATURE NAME="GlobalZoneEU" VERSION="12.0" VENDOR="ALTAIR" START="2013-03-26" END="2014-03-31" USED_LICENSES="111720" TOTAL_LICENSES="147000" SHARE="CUSTOM ,VIRTUAL">
<USER NAME="SYSTEM" HOST="SERV171" IP="172.16.11.115" USED_LICENSES="2000" LOGIN_TIME="2013-04-17 12:42" CHECKOUT_TIME="2013-04-17 12:42" SHARE_CUSTOM="hweuser:172.16.11.115"/>
>
<USER NAME="pbsadmin" HOST="LWSERV171" IP="172.16.11.115" USED_LICENSES="720" LOGIN_TIME="2013-04-17 12:44" CHECKOUT_TIME="2013-04-17 12:44" SHARE_CUSTOM="pbsadmin:LWSERV171:1592_40960072_1356792762_826820"/>
>
<USER NAME="Bell.M" HOST="DBG4327" IP="172.16.225.105" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 07:52" CHECKOUT_TIME="2013-05-21 07:52" SHARE_CUSTOM="Bell.M:DBG4327"/>
>
<USER NAME="Bell.M" HOST="DBG4327" IP="172.16.225.105" USED_LICENSES="6000" LOGIN_TIME="2013-05-21 07:54" CHECKOUT_TIME="2013-05-21 07:54" SHARE_CUSTOM="Bell.M:DBG4327"/>
>
<USER NAME="xu.d" HOST="DBG4970" IP="172.16.225.126" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:15" CHECKOUT_TIME="2013-05-21 08:15" SHARE_CUSTOM="xu.d:DBG4970"/>
>
<USER NAME="xu.d" HOST="DBG4970" IP="172.16.225.126" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:18" CHECKOUT_TIME="2013-05-21 08:18" SHARE_CUSTOM="xu.d:DBG4970"/>
>
<USER NAME="Bell.M" HOST="DBG4327" IP="172.16.225.105" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:23" CHECKOUT_TIME="2013-05-21 08:23" SHARE_CUSTOM="Bell.M:DBG4327"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 08:36" CHECKOUT_TIME="2013-05-21 08:36" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="6000" LOGIN_TIME="2013-05-21 08:37" CHECKOUT_TIME="2013-05-21 08:37" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="hassan.a" HOST="DBG5199" IP="172.16.225.114" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 09:24" CHECKOUT_TIME="2013-05-21 09:24" SHARE_CUSTOM="hassan.a:DBG5199"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 09:33" CHECKOUT_TIME="2013-05-21 09:33" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="6000" LOGIN_TIME="2013-05-21 09:33" CHECKOUT_TIME="2013-05-21 09:33" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="xu.d" HOST="SIM02" IP="172.16.32.12" USED_LICENSES="2000" LOGIN_TIME="2013-05-21 09:39" CHECKOUT_TIME="2013-05-21 09:39" SHARE_CUSTOM="xu.d:SIM02"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 10:05" CHECKOUT_TIME="2013-05-21 10:05" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
>
<USER NAME="xu.d" HOST="DBG4970" IP="172.16.225.126" USED_LICENSES="25000" LOGIN_TIME="2013-05-21 10:25" CHECKOUT_TIME="2013-05-21 10:25" SHARE_CUSTOM="xu.d:DBG4970"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 11:27" CHECKOUT_TIME="2013-05-21 11:27" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="2000" LOGIN_TIME="2013-05-21 11:48" CHECKOUT_TIME="2013-05-21 11:48" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
>
<USER NAME="zeiser-rasumak.a" HOST="DBG5200" IP="172.16.225.127" USED_LICENSES="21000" LOGIN_TIME="2013-05-21 11:49" CHECKOUT_TIME="2013-05-21 11:49" SHARE_CUSTOM="zeiser-rasumak.a:DBG5200"/>
</FEATURE>
<FEATURE NAME="HWAIFPBS" VERSION="12.0" VENDOR="ALTAIR" START="2013-03-26" END="2014-03-31" USED_LICENSES="0" TOTAL_LICENSES="2147483647" SHARE="CUSTOM ,VIRTUAL"/>
<FEATURE NAME="HWAWPF" VERSION="12.0" VENDOR="ALTAIR" START="2013-03-26" END="2014-03-31" USED_LICENSES="0" TOTAL_LICENSES="2147483647" SHARE="CUSTOM ,VIRTUAL"/>

Solution

  • Using LinqToXml and below xml

    <?xml version="1.0" encoding="utf-8"?>
    <Root>
    <FEATURE NAME="f1">
        <USER NAME="u1"/>
        <USER NAME="u2"/>
    </FEATURE>
    
    <FEATURE NAME="f2">
        <USER NAME="u3"/>
        <USER NAME="u4"/>
    </FEATURE>
    
    </Root>
    

    var xDoc = XDocument.Load(filename);
    TreeNode root = new TreeNode();
    LoadTree(xDoc.Root.Element("LICENSE_PATH"), root);
    treeLic.Nodes.Add(root);
    
    void LoadTree(XElement root,TreeNode rootNode)
    {
        foreach (var e in root.Elements().Where(e => e.Attribute("NAME") != null))
        {
            var node = new TreeNode(e.Attribute("NAME").Value);
            rootNode.Nodes.Add(node);
            LoadTree(e, node);
        }
    }