XML in Silverlight 2

Hace unos días estuve desarrollando un pequeño gadget para Windows Vista que consume un XML desde un servidor Web o bien un Endpoint que proviene en REST. Desgraciadamente Silverlight (a diferencia de WPF) no contiene XPath ni te permite hacer Databinding directo – inclusive en Expression Blend 2 viene esa opción deshabilitada y solo te permite hacer binding de objetos de CLR.

Para dicho gadget tenía la necesidad de realizar unas consultas a un combo-box. Leyendo algo de código rápidamente encontré una solución y se las comparto por si en una de esas tienen la necesidad de realizar algo parecido a esto:

Cargando el XML en la memoria

El primer paso para realizar esta acción es que tenemos que obtener el XML de algún lado. Esto lo haces utilizando el objeto WebClient; dicho objeto te permitirá abrir el XML desde un URI para su consumo.

Algo importante es que este proceso lo hacemos asíncronamente. Es decir, primero definimos el manejador de eventos que será disparado una vez que el XML sea abierto, leído y guardado en la memoria (OpenReadCompleted) y posteriormente mandamos a llamar el código dentro de dicho manejador para procesarlo.

Chequen el código:

   1:  namespace Intellekt.Gadget
   2:  {
   3:      public partial class Flyout : UserControl
   4:      {
   5:          public Flyout()
   6:          {
   7:              // Required to initialize variables
   8:              InitializeComponent();
   9:   
  10:              LoadXML();
  11:          }
  12:   
  13:          private void LoadXML()
  14:          {
  15:              WebClient xmlClient = new WebClient();
  16:   
  17:              xmlClient.OpenReadCompleted += new OpenReadCompletedEventHandler(xmlClient_OpenReadCompleted);
  18:              xmlClient.OpenReadAsync(new Uri(“http://intellekt.ws/gadget.svc/countries”, UriKind.RelativeOrAbsolute));
  19:   
  20:          }
  21:      }
  22:  }

Procesando el XML y ligándo los resultados a un control

Una vez que el gadget haya terminado de leer la información mandará a llamar el evento xmlClient_OpenReadCompleted que contendrá el siguiente segmento de código:

   1:          void xmlClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
   2:          {
   3:              if (e.Error != null)
   4:              {
   5:                  HtmlPage.Window.Alert(e.Error.ToString());
   6:              }
   7:              else
   8:              {
   9:                  var s = e.Result;
  10:                  xml = XElement.Load(s);
  11:   
  12:                  var countries = from x in xml.Elements("Country")
  13:                                  select new Country
  14:                                  {
  15:                                      Id = x.Attribute("Id").Value,
  16:                                      _Name = x.Attribute("Name").Value
  17:                                  };
  18:   
  19:                  cboCountry.ItemsSource = countries;
  20:                  foreach (var c in countries)
  21:                  {
  22:                      string d = c._Name;
  23:                  }
  24:   
  25:              }
  26:          }

Este método lo que hará es ver si existe algún error. No existe entonces obtiene todo el Stream en la variable declarada s y lo carga directamente en el xml. Después de eso hacemos una sentencia de LINQ to SQL que obtiene todos los elementos cuyo tag es country y nos regresa un resultado que en la línea 19 estamos ligando a un ComboBox. De la linea 20 en adelante no son necesarias (pero las puse de manera que puedas revisar cada uno de los elementos y que es lo que esta pasando).

Como pueden observar, es muy sencillo procesar XML dentro de Silverlight 2. Si hubieramos intentado realizar esto manualmente utilizando el DOM hubieran sido al menos el doble de líneas de código – LINQ to SQL es una tecnología muy poderosa que en conjunto con Silverlight 2 nos hace la vida más sencilla a los desarrolladores.

Espero que este tip sencillo les sirva.

Cheers! Beer


Comentarios

Deja una respuesta