Capitulo 5 - LINQ to XML (Parte 3)

Lección 3: Transformando XML con LINQ to XML
Además de realizar consultas LINQ, otro de los beneficios de LINQ to XML es la posibilidad de realizar transformaciones del XML a una forma diferente de XML , texto,  en HTML, u objetos.
Transformando XML a objetos
Para transformar XML a objetos, se pueden utilizar todas las técnicas que se describen en este capítulo para la carga y consulta de los datos XML y las descritas en el Capítulo 3 para convertir a los objetos.
--------------------------------VB-------------------------------------

Public Class Customer
Public Property Id() As String
Public Property Name() As String
Public Property Orders() As List(Of Order)
End Class
Public Class Order
Public Property Id() As Integer
Public Property Freight() As Decimal
End Class

Dim doc = XDocument.Load(getFilePath("XDocumentTest.xml"))
Dim CustomersOrders = _
From c In doc.Descendants("Customer")
Select New Customer With
{
.Id = CType(c.Attribute("CustomerID"), String),
.Name = CType(c.Attribute("CompanyName"), String),
.Orders = (From o In c.Elements("Order")
Select New Order With
{
.Id = CType(o.Attribute("OrderID"), Integer),
.Freight = CType(o.Attribute("Freight"), Decimal)
}).ToList()
}

--------------------------------CS-------------------------------------

public class Customer
{
public string Id { get; set; }
public string Name { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int Id { get; set; }
public decimal Freight { get; set; }
}
var doc = XDocument.Load(getFilePath("XDocumentTest.xml"));
var CustomersOrders =
from c in doc.Descendants("Customer")
select new Customer
{
Id = (string)c.Attribute("CustomerID"),
Name = (string)c.Attribute("CompanyName"),
Orders = (from o in c.Elements("Order")
select new Order
{
Id = (int)o.Attribute("OrderID"),
Freight = (decimal)o.Attribute("Freight")
}).ToList()
};

por ej el resultado seria:

ID:ALFKI Name:Alfreds Futterkiste
OrderID:10643 Freight: $29.46
OrderID:10692 Freight: $61.02
ID:ANATR Name:Ana Trujillo
OrderID:10308 Freight: $1.61
OrderID:10625 Freight: $43.90

Transformando XML a texto

De una manera similar a la anterior se puede convertir el XML a un IEnumerable genérico de string y luego mostrar los resultados:
------------------------------VB---------------------------------
Dim CustomersOrders = _
From c In doc.Descendants("Customer")
Select New With
{
.CustomerInfo = _
String.Format("ID:{0} Name:{1}" + vbCrLf, _
CType(c.Attribute("CustomerID"), String),
CType(c.Attribute("CompanyName"), String)
),
.OrderInfo = From o In c.Elements("Order")
Select String.Format(
" OrderID:{0} Freight:{1,7:C}" + vbCrLf, _
CType(o.Attribute("OrderID"), Integer),
CType(o.Attribute("Freight"), Decimal))
}
-----------------------------CS----------------------------------
var customersOrders =
from c in doc.Descendants("Customer")
select new
{CustomerInfo = string.Format("ID:{0} Name:{1}\r\n",
c.Attribute("CustomerID"),
c.Attribute("Name")),
OrderInfo = from o in c.Elements("Order")
select string.Format(" OrderID:{0} Freight:{1,7:C}\r\n",
(int)o.Attribute("OrderID"),
(decimal)o.Attribute("Freight"))
};

Este ejemplo de código produce los mismos resultados que la anterior. La diferencia es que el formateo a string es en las consultas LINQ, y el tipo anónimo tiene el resultado en forma de string, el resultado es mucho más simple.

Transformando XML a XML

Se puede utilizar LINQ to XML para transformar un documento XML en un formato a un documento XML en un formato diferente.
En el siguiente ejemplo, el documento XML que contiene clientes y sus pedidos se transforma en un documento XML que contiene la misma información pero con un formato diferente.

----------------------------VB----------------------------------

image

----------------------------CS----------------------------------
var doc = XDocument.Load(getFilePath("XDocumentTest.xml"));
var newXml = new XDocument(
new XElement("root",
from o in doc.Descendants("Order")
select new XElement("Order",
new XAttribute("CustID",o.Parent.Attribute("CustomerID").Value),
new XAttribute("CustName", o.Parent.Attribute("CompanyName").Value),
new XAttribute("OrdID", o.Attribute("OrderID").Value),
new XAttribute("OrdFreight", o.Attribute("Freight").Value))));

El resultado obtenido seria:

image

Estas ejemplos producen el mismo resultado, pero la versión de C # se parece más ofuscado que el ejemplo de Visual Basic. Los literales XML permiten al programador de Visual Basic incrustar los elementos como literales en el código y utilizar esta sintaxis en el código (<% = expresión%>) .

Resumen de la lección

■Las proyecciones de LINQ to XML permiten convertir XML a objetos.
■ Las proyecciones de LINQ también pueden ayudar a convertir XML a un IEnumerable genérico de string.
■ Las proyecciones de LINQ se puede utilizar con las clases XDocument para convertir XML a una forma diferente de XML.
■ Si utiliza Visual Basic, se pueden tomar usar los literales XML para simplificar las transformaciones.

No hay comentarios:

Publicar un comentario