Entradas para la categoría 'General'

Creando un visor de XML (Parte I)

Martes 12 de Septiembre de 2006 a las 23:58

En este artículo se describe el proceso de desarrollo de una pequeña herramienta que permitirá formatear un documento XML haciendo que resulte más legible, mostrarlo mediante un árbol, y seleccionar nodos mediante XPath visualizando aquéllos que respondan a la expresión de búsqueda resaltados. Adicionalmente se le añadirán otras características secundarias como el guardar y cargar ficheros, una lista de archivos recientes, ajuste de línea y expansión y contracción de todos los nodos del árbol. Es una herramienta sencilla pero que puede ser bastante útil para trabajar con XML.

Debido a sus dimensiones, este artículo ha sido dividido en dos partes. Se puede consultar la segunda parte en la siguiente dirección.

El resultado final de la aplicación mostrando sus tres vistas será el siguiente:

 

(Pulsad la imagen para verla a tamaño real)
Visor
Visor XML. Texto sin formatear.

 

(Pulsad la imagen para verla a tamaño real)
Visor
Visor XML. Vista en árbol.

 

(Pulsad la imagen para verla a tamaño real)
Visor
Visor XML. Texto formateado.

 

FORMATEANDO EL DOCUMENTO XML:

El código para formatear el texto se basa en dos funciones. La primera de ellas se llama FormatearTexto y se encargará de inicializar las variables, cargar el texto introducido en el primer RichTextBox en una variable del tipo XmlDocument. Esta primera función llamará a la segunda (IndentarXML), la cual es una función recursiva que se llamará así misma por cada nodo que tenga el arbol XML.

VB.NET:
  1. Private Sub FormatearTexto(ByVal consultar As Boolean)
  2.         Dim arbol As New Xml.XmlDocument
  3.         Dim profundidad As Integer
  4.         Dim cad As String
  5.  
  6.         'Utilizados solo para hacer la consulta
  7.         Dim nodosSeleccionados As Xml.XmlNodeList
  8.         Dim inicioNodosSeleccionados As ArrayList
  9.         Dim finalNodosSeleccionados As ArrayList
  10.         Dim i As Integer
  11.  
  12.         Try
  13.             arbol.LoadXml(rtxtXML.Text)
  14.  
  15.             profundidad = 0
  16.             cad = ""
  17.             rtxtTextoFormateado.Text = ""
  18.  
  19.             If arbol.FirstChild.NodeType = Xml.XmlNodeType.XmlDeclaration Then
  20.                 cad &= arbol.FirstChild.OuterXml & vbCr
  21.             End If
  22.             If consultar Then
  23.                 nodosSeleccionados = arbol.SelectNodes(txtConsulta.Text)
  24.                 inicioNodosSeleccionados = New ArrayList
  25.                 finalNodosSeleccionados = New ArrayList
  26.                 IndentarXML(arbol.DocumentElement, cad, 0, nodosSeleccionados, inicioNodosSeleccionados, finalNodosSeleccionados)
  27.                 rtxtTextoFormateado.Text = cad
  28.                 For i = 0 To inicioNodosSeleccionados.Count - 1
  29.                     rtxtTextoFormateado.Select(CInt(inicioNodosSeleccionados(i)), CInt(finalNodosSeleccionados(i)) - CInt(inicioNodosSeleccionados(i)))
  30.                     rtxtTextoFormateado.SelectionColor = Color.Blue
  31.                     rtxtTextoFormateado.SelectionFont = fuenteNegritaRTXT
  32.                 Next
  33.             Else
  34.                 IndentarXML(arbol.DocumentElement, cad, profundidad)
  35.                 rtxtTextoFormateado.Text = cad
  36.             End If
  37.         Catch ex As Exception
  38.             MsgBox("Se ha producido el siguiente error:" & vbCrLf & vbCrLf & " - " & ex.Message)
  39.         End Try
  40.     End Sub
  41.  
  42.     Private Function IndentarXML(ByVal nodo As Xml.XmlNode, ByRef cad As String, ByVal profundidad As Integer, Optional ByVal nodosSeleccionados As Xml.XmlNodeList = Nothing, Optional ByVal inicioNodosSeleccionados As ArrayList = Nothing, Optional ByVal finalNodosSeleccionados As ArrayList = Nothing) As String
  43.         Dim hijo As Xml.XmlNode
  44.         Dim atr As Xml.XmlAttribute
  45.  
  46.         If nodo.NodeType <> Xml.XmlNodeType.Text And nodo.NodeType <> Xml.XmlNodeType.Comment Then
  47.             'cad &= New String(Chr(9), profundidad)
  48.             cad &= New String(" "c, profundidad * 7)
  49.  
  50.             If Not nodosSeleccionados Is Nothing AndAlso estaSeleccionado(nodo, nodosSeleccionados) Then
  51.                 If cad = "" Then
  52.                     inicioNodosSeleccionados.Add(0)
  53.                 Else
  54.                     inicioNodosSeleccionados.Add(cad.Length - 1)
  55.                 End If
  56.  
  57.             End If
  58.  
  59.             cad &= "<" & nodo.Name
  60.             For Each atr In nodo.Attributes
  61.                 cad &= " " & atr.Name & "=""" & atr.Value & """"
  62.             Next
  63.             cad &= ">"
  64.  
  65.             If Not nodosSeleccionados Is Nothing AndAlso estaSeleccionado(nodo, nodosSeleccionados) Then
  66.                 finalNodosSeleccionados.Add(cad.Length)
  67.             End If
  68.  
  69.             cad &= textoDelNodo(nodo)
  70.  
  71.             If tieneHijos(nodo) Then
  72.                 cad &= vbCr
  73.                 For Each hijo In nodo.ChildNodes
  74.                     IndentarXML(hijo, cad, profundidad + 1, nodosSeleccionados, inicioNodosSeleccionados, finalNodosSeleccionados)
  75.                 Next
  76.                 'cad &= New String(Chr(9), profundidad)
  77.                 cad &= New String(" "c, profundidad * 7)
  78.             End If
  79.             cad &= "</" & nodo.Name & ">" & vbCr
  80.         End If
  81.     End Function

La función "FormatearTexto" recibe un parámetro que indica si se está realizando una consulta o no. Si es así, se obtendrán todos los nodos seleccionados por la consulta y se crearán dos arrayList para almacenar las posiciones iniciales y finales de los nodos seleccionados, para poder posteriormente resaltarlos en el RichTextBox.

La función "IndentarXML" se encarga de transformar el nodo en cadena formateada y de llamarse a si misma recursivamente por cada hijo que tuviera el nodo. El parámetro profundidad se va incrementando en uno en cada nivel del árbol, y sirve para tabular correctamente el texto de cada nodo. Si se esta consultando y el nodo actual pertenece a los nodos seleccionados por la consulta XPath, entonces se marcará su posición inicial y final añadiéndolas a los arrayList.

Continuación
Creando un visor de XML (Parte II)

Plugin del wordpress mejorado

Miércoles 6 de Septiembre de 2006 a las 23:57

Para mostrar el código coloreado en el blog utilizo un plugin para el wordpress llamado iG:Syntax Hiliter. Este plugin es muy útil e interesante ya que permite colorear el código de múltiples lenguajes de programación. Sin embargo presenta una serie de deficiencias que he intentado solucionar.

Por un lado, es un poco incómodo leer el código en la ventana que se muestra ya que no suele caber todo y se necesita una barra de scroll horizontal lo que dificulta su lectura. Para solucionarlo le he realizado unas modificaciones para permitir abrir una nueva ventana del navegador con el código coloreado. En la parte superior izquierda del recuadro que muestra el código ahora aparece la opción "Maximizar", que abre una ventana de las mismas dimensiones que la pantalla con el código

Por otro lado, en el código en VB.Net, que es el que yo utilizo, no coloreaba correctamente muchas palabras. Así que también le hice unos cambios en el fichero que colorea el código en VB.Net.

Lo he probado en el Firefox y en el Internet Explorer y funciona correctamente, de todas formas si encontráis algún bug por favor comunicádmelo.

Lo podéis ver por ejemplo en los siguientes post:

Autómata finito determinista para reconocer constantes numéricas
Coloreando el código en el editor

Si alguien esta interesado en el plugin modificado que me lo pida y se lo envío. El plugin original se distribuye bajo la licencia GNU GPL, espero no infringirla. Si no es así por favor comunicádmelo.

El original se pueden encontrar en la siguiente dirección: iG:Syntax Hiliter

Se agradecen recomendaciones de otros plugins interesantes para el wordpress.

De nuevo online

Domingo 3 de Septiembre de 2006 a las 18:29

Después de estar dos días cerrado, por fin este sitio vuelve a estar en funcionamiento, esta vez con dominio propio.
El proveedor de hosting me ha cerrado la página sin dar ningún tipo de explicación ni responder a ninguno de los mails que le he enviado.

Para evitar que esto volviera a suceder en un futuro me he decidido por tener un dominio propio y un hosting de pago que me de más seguridad de que no me dejarán sin servicio de buenas a primeras.

Restaurando los datos de la base de datos he tenido algunos problemas con los acentos debido a las diferentes codificaciones de los caracteres, pero afortunadamente también está solucionado este tema.

He de pedir a aquellos que tengan enlazado este sitio que actualicen los links por favor.

Blog: Una buena idea

Martes 29 de Agosto de 2006 a las 23:59

Hoy hace un mes desde que se inauguró el blog, y haciendo balance, creo que resultó ser una buena idea lo de crear un blog donde ir escribiendo los progresos que voy realizando en el proyecto que estoy desarrollando (un motor para aventuras gráficas). Me está motivando para seguir desarrollando y no abandonar el proyecto, cosa que en un proyecto tan ambicioso como este no sería raro que sucediese y que ya me ha pasado con un proyecto anterior que he abandonado y retomado por lo menos en cinco ocasiones.

También he de reconocer que el mantener el blog me lleva bastante tiempo que podría dedicar a desarrollar. De hecho probablemente le haya dedicado más tiempo a configurar el blog y escribir post que al desarrollo del proyecto. He de decir que esto de mantener un blog es bastante adictivo :-) En estos diecisiete días (descontando las vacaciones) he publicado diez post.

De momento, y pese al pequeño paréntesis de las vacaciones, estoy bastante contento con el ritmo de trabajo que estoy llevando y con como evoluciona la aplicación. Sobre todo teniendo en cuenta el poco tiempo del que dispongo.

Contando las líneas de nuestros proyectos

Lunes 28 de Agosto de 2006 a las 23:53

A mí siempre me ha resultado interesante contar las líneas que tienen los proyectos que estoy realizando e ir viendo como evolucionan las dimensiones de los distintos módulos y clases.

Hace tiempo desarrollé un add-in para el Visual Studio 2003 que realizaba esta tarea. Pero no era tan completo como otros existentes.

El más interesante que he encontrado de los gratuitos es el Line Counter que puede descargarse desde aquí y que se puede utilizar con todas las versiones del Visual Studio.

Muestra las líneas por fichero, por proyecto y el total de la solución, permitiendo filtros para obviar ciertos ficheros o para tener en cuenta solo un determinado proyecto. Te muestra el número de líneas, las que son solo de código, las que son solo de comentarios, las que son de código y comentarios y las que están en blanco. También te muestra los porcentajes que representan cada una de ellas sobre el total.

Pagina web de la aplicación

MSX: Una de nostalgia

Viernes 25 de Agosto de 2006 a las 0:01

El primer ordenador que tuve, con unos 8 años, y del que guardo buenísimos recuerdos fue un MSX: el Spectravideo SVI 728. Gracias a este ordenador se despertó en mi la pasión por la informática y la programación. Posteriormente, cuando tuve que decidir a que profesión dedicarme, fue decisivo para que me inclinara por dedicarme a la programación.

La de horas de mi niñez que pasaría frente a su pantalla azul haciendo mis primeros pinitos en el mundo de la programación. La de veces que habré leído aquello de "Syntax Error". El MSX se programaba en Basic, un sencillo lenguaje en cuyos programas abundaban los GOTOS, tan denostados hoy en día y que suenan tan lejanos. Recuerdo cuando descubrí que existía una sentencia llamada GOSUB que permitía hacer algo parecido a los procedimientos.

En la pagina de proyectos se pueden ver algunos de los juegos que realice en BASIC con el MSX.
Además realice alguna pequeña aplicación de gestión. Una de ellas permitía gestionar una biblioteca doméstica.

También guardo gratísimos recuerdos de esos grandes juegos que han hecho historia sin tener los gráficos sumamente realistas de los actuales. Juegos como Batman, Head Over Hells, Pac man, Sea Hunter, La abadia del crimen, Army moves, Navy moves, Goody, Arkanoid, Las tres luces de Glaurung, Livingstone supongo y una larga lista de títulos tremendamente adictivos.

Este era el aspecto que tenía:

Spectravideo SVI 728.
Spectravideo SVI 728.

Un par de enlaces sobre este ordenador, en uno de ellos hay un error ya que la fecha de lanzamiento tengo entendido que fue en 1983.

http://www.zonadepruebas.com/modules/wfsection/article.php?articleid=586

http://www.museo8bits.com/svi728.htm

Vuelta de vacaciones

Sábado 19 de Agosto de 2006 a las 20:14

Acabo de llegar de las vacaciones. Razón por la que durante lo que va de mes he tenido abandonado este sitio y la programación de la aventura gráfica. Espero continuar su desarrollo, aunque no al nivel que desearía ya que tengo que ponerme ha estudiar para los inminentes exámenes de Septiembre en el poco tiempo libre que tengo tras el trabajo.

Actualizada la página de proyectos

Lunes 31 de Julio de 2006 a las 8:56

Hoy he actualizado la página de proyectos, describiendo brevemente algunos de los proyectos que he realizado y poniendo una breve introducción al proyecto que estoy realizando en la actualidad.

No me gusta mucho como ha quedado la página, no es muy legible. Esta todo muy junto, parece que es por los estilos del theme que estoy usando y porque el wordpress elimina los saltos de línea e indicadores de párrafo.

Podeís acceder a ella en el enlace del menú o mendiante este enlace

Bienvenidos

Sábado 29 de Julio de 2006 a las 15:27

Hoy inauguro este blog. En el pretendo ir subiendo artículos relacionados con el desarrollo de videojuegos, un tema que me interesa especialmente.
Llevaré también un diario de trabajo de los proyectos que vaya realizando, comentando los avances, dificultades, etc. Especialmente una aventura gráfica que estoy desarrollando en la actualidad. Bueno, más que una aventura gráfica es un conjunto de herramientas para que cualquiera sin unos grandes conocimientos de programación pueda crearse su propia aventura gráfica.

Todavía quedan muchas cosas por pulir en cuanto a la estructura y apariencia de la web.