LINQ to XML con MVC
En el siguiente tutorial sobre LINQ to XML con MVC vamos a ver:
- Qué es LINQ.
- Qué es XML.
- Cómo leer un fichero XML con LINQ y mostrar los datos dentro de una tabla en un proyecto MVC.
¿Qué es LINQ?
LINQ o Language Integrated Query son un conjunto de herramientas que permiten realizar consultas a distintas fuentes de datos como pueden ser bases de datos, xml, etc…
¿Qué es XML?
XML o Extensible Markup Language es un lenguaje que permite almacenar datos de manera legible. A grandes rasgos, los documentos XML están formados por el prólogo donde se indica que el documento es de tipo XML y por el cuerpo, el cual parte de un elemento raíz y engloba al resto de elementos y atributos.
Práctica: leer un fichero XML con LINQ y mostrar los datos en MVC
Antes de empezar vamos a guardarnos lo siguiente en un archivo con el siguiente nombre y extensión: Libros.xml:
<?xml version="1.0"?> <Catalogo> <Libro> <LibroId>bk101</LibroId> <Autor>Gambardella, Matthew</Autor> <Titulo>XML Developer's Guide</Titulo> <Genero>Computer</Genero> <Precio>44.95</Precio> <Fecha_Publicacion>2000-10-01</Fecha_Publicacion> <Descripcion> An in-depth look at creating applications with XML. </Descripcion> </Libro> <Libro> <LibroId>bk102</LibroId> <Autor>Ralls, Kim</Autor> <Titulo>Midnight Rain</Titulo> <Genero>Fantasy</Genero> <Precio>5.95</Precio> <Fecha_Publicacion>2000-12-16</Fecha_Publicacion> <Descripcion> A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world. </Descripcion> </Libro> </Catalogo>
En primer lugar vamos a crearnos el proyecto. File > New > Project > ASP.NET Web Application y le damos el nombre que queramos, en mi caso Practica_LINQtoXML_MVC.

Pulsamos OK y en la siguiente ventana seleccionamos Empty y marcamos el tick para añadir las referencias para MVC.

Pulsamos OK y se nos creará el proyecto.
Damos click derecho sobre la carpeta App_Data > Add > Existing item y buscamos el documento XML que guardamos al principio del tutorial.
Lo siguiente que haremos será crearnos una librería de clases dentro de la solución. Para ello botón derecho sobre la solución > Add > New Project > Buscamos Class Library y la llamamos Practica.Helper.

Se nos creará una clase que renombraremos con el nombre de XMLReader.cs.

Dentro de nuestra librería de clases creamos una carpeta External.Models y hacemos click derecho sobre ella > Add > Class, y la llamamos Libros.cs. Escribimos el siguiente código:

[sourcecode language=”csharp”]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Practica.Helper.External.Models
{
public class Libros
{
public String LibroId { get; set; }
public String Autor { get; set; }
public String Titulo { get; set; }
public String Genero { get; set; }
public String Precio { get; set; }
public String Fecha_Publicacion { get; set; }
public String Descripcion { get; set; }
}
}
[/sourcecode]
Volvemos a nuestro XMLReader. Aquí vamos a cargar nuestro documento XML, a mapearlo y a guardar los objetos de tipo Libros en una lista. Para ello escribimos el siguiente código:

[sourcecode language=”csharp”]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using System.Web; // Añadir
using System.Data; // Añadir
using Practica.Helper.External.Models; // Añadir
namespace Practica.Helper
{
public class XMLReader
{
public List GetLibros()
{
// Ruta del documento xml
String ruta = HttpContext.Current.Server.MapPath(«~/App_Data/Libros.xml»);
// Cargamos el documento
XDocument docxml = XDocument.Load(ruta);
// Recuperamos los datos
// Con Descendantos indicamos la raíz
var consulta = from datos in docxml.Descendants(«Libro»)
select new Libros
{
// Mapeamos los campos
// IMPORTANTE: El nombre de los Element debe corresponderse
// con el nombre de los elementos del documento
LibroId = datos.Element(«LibroId»).Value
, Autor = datos.Element(«Autor»).Value
, Titulo = datos.Element(«Titulo»).Value
, Genero = datos.Element(«Genero»).Value
, Precio = datos.Element(«Precio»).Value
, Fecha_Publicacion = datos.Element(«Fecha_Publicacion»).Value
, Descripcion = datos.Element(«Descripcion»).Value
};
// Guardamos lo que recibimos de la consulta en una lista
List libros = consulta.ToList();
return libros;
}
}
}
[/sourcecode]
Ahora que tenemos la librería hecha vamos a utilizarla en nuestro proyecto Practica_LINQtoXML_MVC. Para ello primero tenemos que referenciarla. Hacemos click derecho sobre References > Add Reference > Solution y seleccionamos Practica.Helper.

Pulsamos Ctrl+Shift+B para compilar la solución.
Ahora vamos a añadir nuestro controlador para la vista. Damos click derecho sobre la carpeta Controllers > Add > Controller y elegimos MVC 5 Controller – Empty.

Le ponemos el nombre LibrosController.
Ahora que tenemos el controlador vamos a generar la vista asociada a él. Para ello le damos click derecho sobre Index > Add View y dejamos todo por defecto y le damos a Add.

Se nos habrá creado, dentro de la carpeta Views de nuestra solución, una carpeta Libros y dentro un Index.cshtml.
En Index.cshtml determinamos de qué forma vamos a mostrar los datos. En este caso vamos a hacer una tabla que rellenaremos con el id, título, autor, género y precio de los libros de nuestro XML. Aquí es importante añadir el @model para poder acceder a las propiedades de nuestro objeto Libros como veremos debajo.

[sourcecode language=”csharp”]
@{
ViewBag.Title = «Index»;
}
@using Practica.Helper.External.Models;
@model List
Lista de libros utilizando XML
@foreach (var item in Model)
{}
| Id | Título | Autor | Género | Precio |
|---|---|---|---|---|
| @Html.DisplayFor(modelItem => item.LibroId) | @Html.DisplayFor(modelItem => item.Titulo) | @Html.DisplayFor(modelItem => item.Autor) | @Html.DisplayFor(modelItem => item.Genero) | @Html.DisplayFor(modelItem => item.Precio)€ |
[/sourcecode]
Volvemos a nuestro LibrosController.cs y añadimos el siguiente código para que nos mande los datos a la vista y así podamos visualizarlos.

Click para ampliar
[sourcecode language=”csharp”]using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Practica.Helper; // Añadir
namespace Practica_LINQtoXML_MVC.Controllers
{
public class LibrosController : Controller
{
// GET: Libros
public ActionResult Index()
{
XMLReader readXML = new XMLReader();
var datos = readXML.GetLibros();
return View(datos);
}
}
}[/sourcecode]
De nuevo volvemos a nuestro Index.cshtml y pulsamos F5 para compilar y ver el resultado en nuestro navegador.

Hasta aquí llegaría nuestro ejemplo sobre cómo leer un archivo XML con LINQ.
Si lo necesitáramos incluso podríamos leer un XML que tuviéramos por ejemplo alojado en Azure o en cualquier otro sitio haciendo unos mínimos cambios.
Espero que os haya servido de ayuda y nos vemos en siguientes post.
Un saludo.
Descripción: en el siguiente tutorial vamos a ver cómo leer datos de un archivo XML mediante LINQ y cómo mostrarlos en un proyecto MVC.
Autor: Jorge Bravo Sayago
Curso: Microsoft MCSD Web Applications + SharePoint Apps
Centro: Tajamar
Año académico: 2016-2017