sábado, 30 de agosto de 2014

Mostrar un xml en un treeview

Esto es un ejemplo muy sencillo de como mostrar un xml con un treeview.

Documentación:
Código:


Public Class frmXML
    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
Salida:

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>

No hay comentarios:

Publicar un comentario