Creando un visor de XML (Parte II)
Este artículo es la continuación de:
Creando un visor de XML (Parte I)
POBLANDO EL TREEVIEW:
El proceso es muy similar al descrito anteriormente, salvo que ahora en vez de transformar el árbol en una cadena de texto formateada, se irán incluyendo sus nodos jerárquicamente en un TreeView.
Para poblar el TreeView también nos basaremos en dos funciones, una para inicializar las variables y cargar el documento xml, y otra que será llamada de forma recursiva.
-
Private Sub MostrarArbol(ByVal consultar As Boolean)
-
Dim arbol As New Xml.XmlDocument
-
Dim nodoRaiz As TreeNode
-
Dim atr As Xml.XmlAttribute
-
-
'Utilizados solo para hacer la consulta
-
Dim nodosSeleccionados As Xml.XmlNodeList
-
-
Try
-
arbol.LoadXml(rtxtXML.Text)
-
-
trvXML.Nodes.Clear()
-
nodoRaiz = New TreeNode(arbol.DocumentElement.Name)
-
For Each atr In arbol.DocumentElement.Attributes
-
nodoRaiz.Text &= " " & atr.Name & "=" & atr.Value
-
Next
-
trvXML.Nodes.Add(nodoRaiz)
-
-
If consultar Then
-
nodosSeleccionados = arbol.SelectNodes(txtConsulta.Text)
-
If estaSeleccionado(arbol.DocumentElement, nodosSeleccionados) Then
-
nodoRaiz.ForeColor = Color.Blue
-
nodoRaiz.NodeFont = fuenteNegritaArbol
-
End If
-
AnadirNodosAArbol(nodoRaiz, arbol.DocumentElement, nodosSeleccionados)
-
Else
-
AnadirNodosAArbol(nodoRaiz, arbol.DocumentElement)
-
End If
-
-
trvXML.ExpandAll()
-
-
Catch ex As Exception
-
MsgBox("Se ha producido el siguiente error:" & vbCrLf & vbCrLf & " - " & ex.Message)
-
End Try
-
-
End Sub
-
-
Private Sub AnadirNodosAArbol(ByVal arbol As TreeNode, ByVal nodo As Xml.XmlNode, Optional ByVal nodosSeleccionados As Xml.XmlNodeList = Nothing)
-
Dim hijo As Xml.XmlNode
-
Dim atr As Xml.XmlAttribute
-
Dim nodoArbol As TreeNode
-
-
For Each hijo In nodo.ChildNodes
-
If hijo.NodeType <> Xml.XmlNodeType.Text And hijo.NodeType <> Xml.XmlNodeType.Comment Then
-
nodoArbol = New TreeNode(hijo.Name)
-
If Not nodosSeleccionados Is Nothing Then
-
If estaSeleccionado(hijo, nodosSeleccionados) Then
-
nodoArbol.ForeColor = Color.Blue
-
nodoArbol.NodeFont = fuenteNegritaArbol
-
End If
-
End If
-
arbol.Nodes.Add(nodoArbol)
-
If textoDelNodo(hijo) <> "" Then
-
nodoArbol.Text &= "=" & textoDelNodo(hijo)
-
End If
-
For Each atr In hijo.Attributes
-
nodoArbol.Text &= " " & atr.Name & "=" & atr.Value
-
Next
-
-
anadirNodosAArbol(nodoArbol, hijo, nodosSeleccionados)
-
End If
-
Next
-
End Sub
COMPLETANDO LA HERRAMIENTA:
Con esto se habrá terminado el núcleo de nuestra aplicación, habiéndola dotado de la funcionalidad básica para la que se ideó, es decir, el mostrar el xml formateado para que resulte más legible, mostrarlo mediante un árbol y permitir seleccionar nodos mediante XPath visualizando aquellos que respondan a la expresión de búsqueda resaltados.
Vayamos ahora a dotarla de ciertos elementos adicionales para completar la aplicación.
En primer lugar le añadiremos la funcionalidad de permitir ajustar las líneas para que todo el texto de una línea se muestre en pantalla, ocupando las líneas que sean necesarias para mostrarse. Esto es tan sencillo como añadir un checkBox, y establecer la propiedad WordWrap de los RichTextBox al valor de la propiedad Checked del checkBox
Le añadiremos también la funcionalidad de cargar y guardar ficheros. Con este fin se crearán dos elementos de menú y se les asociarán teclas de acceso rápido, CTRL+C y CTRL+G respectivamente. El documento que guardaremos será el xml ya formateado, no el original.
Según vayamos cargando ficheros, éstos se irán incluyendo en la lista de recientes hasta un máximo de cinco. De igual forma incluimos en la lista de ficheros recientes aquéllos documentos que guardemos. El código que realiza esta inserción es el siguiente:
-
Private Sub InsertarEnRecientes(ByVal nombreFichero As String)
-
Dim menu As MenuItem
-
Dim i As Integer
-
Dim encontrado As Boolean
-
-
Try
-
i = 0
-
While i <= mnuRecientes.MenuItems.Count - 1 And Not encontrado
-
'Si ya estaba lo quitamos
-
If mnuRecientes.MenuItems(i).Text = nombreFichero Then
-
mnuRecientes.MenuItems.RemoveAt(i)
-
encontrado = True
-
End If
-
i = i + 1
-
End While
-
menu = New MenuItem(nombreFichero, AddressOf FichReciente_Click)
-
mnuRecientes.MenuItems.Add(0, menu)
-
If mnuRecientes.MenuItems.Count = 6 Then
-
mnuRecientes.MenuItems.RemoveAt(5)
-
End If
-
Catch ex As Exception
-
MsgBox("Se ha producido el siguiente error:" & vbCrLf & vbCrLf & " - " & ex.Message)
-
End Try
-
-
End Sub
Cuando se cierre el formulario, se guardará la lista de ficheros recientes en un fichero XML, para que dicha listas persista entre ejecuciones de la aplicación.
-
Private Sub GuardarRecientes()
-
Dim arbol As New Xml.XmlDocument
-
Dim nodo As Xml.XmlNode
-
Dim menu As MenuItem
-
-
Try
-
nodo = arbol.CreateElement("Recientes")
-
arbol.AppendChild(nodo)
-
-
For Each menu In mnuRecientes.MenuItems
-
nodo = arbol.CreateElement("Fichero")
-
nodo.InnerText = menu.Text
-
arbol.DocumentElement.AppendChild(nodo)
-
Next
-
-
arbol.Save(Application.StartupPath & "\Recientes.xml")
-
-
Catch ex As Exception
-
MsgBox("Se ha producido el siguiente error:" & vbCrLf & vbCrLf & " - " & ex.Message)
-
End Try
-
End Sub
Primera parte de este artículo: