Documentación:
- http://msdn.microsoft.com/en-us/library/bb308960.aspx
- http://stackoverflow.com/questions/5437713/binding-hierarchical-xml-to-treeview
- http://www.codeproject.com/Articles/12606/Loading-and-Saving-XML-to-and-from-a-TreeView-Cont
Private m_ruta As String = "Contactos.xml"
Private Sub frmXML_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim doc As XDocument = XDocument.Load(m_ruta)
Dim root As XElement = doc.Root
Dim x = GetNodes(New TreeNode(root.Name.LocalName), root).ToArray()
TreeView1.Nodes.AddRange(x)
End Sub
Private Function GetNodes(ByVal node As TreeNode, ByVal element As XElement) As IEnumerable(Of TreeNode)
If element.HasElements Then
Return TreeNodeEx.AddRange(node, (From item In element.Elements() _
Let tree = New TreeNode(item.Name.LocalName) _
From newNode In GetNodes(tree, item) _
Select newNode))
Else
node.Text = element.Name.LocalName & " = " & element.Value
Return New TreeNode() {node}
End If
End Function
End Class
Public Class TreeNodeEx
Public Shared Function AddRange(ByVal collection As TreeNode, ByVal nodes As IEnumerable(Of TreeNode)) As IEnumerable(Of TreeNode)
Dim items = nodes.ToArray()
collection.Nodes.AddRange(items)
Return New TreeNode() {collection}
End Function
End Class
Nota: el xml lo dejo por si alguno le interesa pero valdría cualquiera, el código no tiene ninguna referencia a los elementos del xml
<contacts>
<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
<address>
<street1>123 Main St</street1>
<city>Mercer Island</city>
<state>WA</state>
<postal>68042</postal>
</address>
<netWorth>10</netWorth>
</contact>
<contact>
<name>Gretchen Rivas</name>
<phone type="mobile">206-555-0163</phone>
<address>
<street1>123 Main St</street1>
<city>Mercer Island</city>
<state>WA</state>
<postal>68042</postal>
</address>
<netWorth>11</netWorth>
</contact>
<contact>
<name>Scott MacDonald</name>
<phone type="home">925-555-0134</phone>
<phone type="mobile">425-555-0177</phone>
<address>
<street1>345 Stewart St</street1>
<city>Chatsworth</city>
<state>CA</state>
<postal>91746</postal>
</address>
<netWorth>500000</netWorth>
</contact>
</contacts>
<contact>
<name>Patrick Hines</name>
<phone type="home">206-555-0144</phone>
<phone type="work">425-555-0145</phone>
<address>
<street1>123 Main St</street1>
<city>Mercer Island</city>
<state>WA</state>
<postal>68042</postal>
</address>
<netWorth>10</netWorth>
</contact>
<contact>
<name>Gretchen Rivas</name>
<phone type="mobile">206-555-0163</phone>
<address>
<street1>123 Main St</street1>
<city>Mercer Island</city>
<state>WA</state>
<postal>68042</postal>
</address>
<netWorth>11</netWorth>
</contact>
<contact>
<name>Scott MacDonald</name>
<phone type="home">925-555-0134</phone>
<phone type="mobile">425-555-0177</phone>
<address>
<street1>345 Stewart St</street1>
<city>Chatsworth</city>
<state>CA</state>
<postal>91746</postal>
</address>
<netWorth>500000</netWorth>
</contact>
</contacts>