ProblemYou have some XML content in a file. You want to display it using a TReeView control, so that you can expand specific branches. SolutionSample code folder: Chapter 14\XMLTreeView There are many ways to go about this task, but one of the most straightforward is to load the content into an XmlDocument object, then traverse this object's attributes and nodes. This recipe's code loads an XML file into a TReeView control. DiscussionCreate a new Windows Forms application, and add the following controls to Form1:
Add informational labels if desired, and arrange the controls so that Form1 looks like the form in Figure 14-17. Figure 14-17. Controls on the XML-to-TreeView sampleNow add the following source code to Form1's class template: Private Sub LoadFile_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles LoadFile.Click ' ----- Load an XML file into the form's TreeView control. Dim fileContent As Xml.XmlDocument ' ----- Make sure the file exists. If (My.Computer.FileSystem.FileExists(XMLFile.Text) = _ False) Then MsgBox("Please supply a valid file name.") Return End If ' ----- Load the XML content into an XMLDocument object. Try fileContent = New Xml.XmlDocument fileContent.Load(XMLFile.Text) Catch ex As Exception MsgBox("The XML file could not be loaded due to " & _ "the following error:" & vbCrLf & vbCrLf & _ ex.Message) fileContent = Nothing Return End Try ' ----- Remove any existing content in the TreeView. XMLTree.Nodes.Clear( ) ' ----- Call a recursive method that will scan down ' all branches of the XML file. For Each oneNode As Xml.XmlNode In fileContent.ChildNodes AddNodeToTree(oneNode, Nothing) Next oneNode End Sub Private Sub AddNodeToTree(ByVal oneNode As Xml.XmlNode, _ ByVal fromNode As TreeNode) ' ----- Add a node and all of its subordinate items. Dim baseNode As TreeNode ' ----- Ignore plain text nodes, as they are picked up ' by the inner-text code below. If (oneNode.NodeType = Xml.XmlNodeType.Text) Then Return ' ----- Treat the "<?xml…" node specially. If (oneNode.NodeType = Xml.XmlNodeType.XmlDeclaration) _ And (fromNode Is Nothing) Then baseNode = XMLTree.Nodes.Add( _ oneNode.OuterXml.ToString( )) Return End If ' ----- Add the node itself. If (fromNode Is Nothing) Then baseNode = XMLTree.Nodes.Add(oneNode.Name) Else baseNode = fromNode.Nodes.Add(oneNode.Name) End If ' ----- Add the attributes. If (oneNode.Attributes IsNot Nothing) Then For Each oneAttr As Xml.XmlAttribute In _ oneNode.Attributes baseNode.Nodes.Add("Attribute: " & oneAttr.Name & _ " = """ & oneAttr.Value & """") Next oneAttr End If ' ----- Add content if available. If (oneNode.InnerText <> "") Then baseNode.Nodes.Add("Content: " & oneNode.InnerText) End If ' ----- Add the child nodes. If (oneNode.ChildNodes IsNot Nothing) Then For Each subNode As Xml.XmlNode In oneNode.ChildNodes AddNodeToTree(subNode, baseNode) Next subNode End If End Sub To run the program, type a valid XML filename in the XMLFile field, and then click the Load button. The XML content appears in the treeView control, with branches collapsed. This program was run using this recipe's .vbproj file for the input (it's an XML file). Figure 14-18 shows the results. Figure 14-18. XML displayed as a TreeViewThe TreeView control is designed to present hierarchical data, which is precisely what you find in XML content. The System.Xml.XmlDocument object represents the content of XML data by parsing the raw XML text and building distinct Xml.XmlNode objects for each element and branch point within the content. Both XmlDocument and XmlNode include a ChildNodes collection that provides access to the XML tags found immediately within the current tag. These objects also include an Attributes collection that lists the name and value of each tag attribute. See AlsoRecipes 14.23 and 14.24 discuss other methods of working with XML content. |