VB XML Literals - Parte 2

En la parte 1 de esta serie de posts sobre XML Literals expliqué en el ejemplo como cargar un objeto a partir de un archivo xml. Ahora veré el caso contrario: A partir de un objeto Order creare un archivo xml con la información de la orden. Este es el test con que comprobaré que mi método esta funcionando:

[TestMethod]
public void should_save_order_to_file()
{
var fileName = @"..\..\Order_Temp.xml";

if (File.Exists(fileName)) File.Delete(fileName);

var order = CreateSampleOrder();

var orderXmlTasks = new OrderXmlTasks();
orderXmlTasks.SaveToFile(fileName, order);

File.Exists(fileName).Should().Be.True();

var fileLines = File.ReadAllLines(fileName);
var expectedLines = CreateExpectedXml();
for (int i = 0; i < fileLines.Length; i++)
{
var line = fileLines[i].Trim();
line.Should().Be.EqualTo(expectedLines[i]);
}
}

public Order CreateSampleOrder()
{
return new Order
{
Id = 321,
Customer = "Peter Griffin",
Items = new List<OrderItem>
{
new OrderItem { ProductId = 3, Quantity = 1, Price = 2.05m, Description = "product x" },
new OrderItem { ProductId = 7, Quantity = 4, Price = 3.45m, Description = "product y" },
new OrderItem { ProductId = 8, Quantity = 9, Price = 5.50m, Description = "product z" },
}
};
}

public string[] CreateExpectedXml()
{
var xml = new List<string>();

xml.Add("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
xml.Add("<order id=\"321\" xmlns=\"urn:schemas-developeando-com:xmlLiterals\">");
xml.Add("<customer>Peter Griffin</customer>");
xml.Add("<items>");
xml.Add("<item productId=\"3\" quantity=\"1\" price=\"2.05\">product x</item>");
xml.Add("<item productId=\"7\" quantity=\"4\" price=\"3.45\">product y</item>");
xml.Add("<item productId=\"8\" quantity=\"9\" price=\"5.50\">product z</item>");
xml.Add("</items>");
xml.Add("</order>");

return xml.ToArray();
}

Lo que hace el test es crear una orden de ejemplo (CreateSampleOrder), escribir los datos de la orden en un archivo xml y después leo el archivo generado y lo comparo con el xml esperado (CreateExpectedXml)

Generar xml usando XML Literals es tan simple como solo escribir el XML y agregar expresiones donde queremos insertar código. Entonces el código para que la prueba pase queda así:

Public Sub SaveToFile(ByVal FileName As String, ByVal Order As Order)
Dim xml = <order id=<%= Order.Id %>>
<
customer><%= Order.Customer %></customer>
<
items>
<%= From item In Order.Items _
Select <item
productId=<%= item.ProductId %>
quantity=<%= item.Quantity %>
price=<%= item.Price %>>
<%= item.Description %>
</item> %>
</items>
</
order>
xml.Save(FileName)
End Sub

Como se puede apreciar solo declaro una variable y le asigno el xml, usando expresiones para indicar donde quiero escribir los valores de las propiedades del objeto Order. Para los items utilizo una expresión LINQ para indicar que por cada item agregue un elemento <item> y asigno el valor a los atributos y el valor de la descripción en el texto interno.

Comentarios