using System.Xml.Serialization;
[XmlRootAttribute("PurchaseOrder", Namespace="http://www.cpandl.com",
public class PurchaseOrder
[XmlArrayAttribute("Items")]
public OrderedItem[] OrderedItems;
public decimal TotalCost;
[XmlElementAttribute(IsNullable = false)]
public string Description;
public decimal UnitPrice;
public decimal LineTotal;
LineTotal = UnitPrice * Quantity;
public static void Main()
private void CreatePO(string filename)
XmlSerializer serializer =
new XmlSerializer(typeof(PurchaseOrder));
TextWriter writer = new StreamWriter(filename);
PurchaseOrder po=new PurchaseOrder();
Address billAddress = new Address();
billAddress.Name = "Teresa Atkinson";
billAddress.Line1 = "1 Main St.";
billAddress.City = "AnyTown";
billAddress.State = "WA";
billAddress.Zip = "00000";
po.OrderDate = System.DateTime.Now.ToLongDateString();
OrderedItem i1 = new OrderedItem();
i1.ItemName = "Widget S";
i1.Description = "Small widget";
i1.UnitPrice = (decimal) 5.23;
OrderedItem [] items = {i1};
decimal subTotal = new decimal();
foreach(OrderedItem oi in items)
subTotal += oi.LineTotal;
po.ShipCost = (decimal) 12.51;
po.TotalCost = po.SubTotal + po.ShipCost;
serializer.Serialize(writer, po);
protected void ReadPO(string filename)
XmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder));
serializer.UnknownNode+= new
XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute+= new
XmlAttributeEventHandler(serializer_UnknownAttribute);
FileStream fs = new FileStream(filename, FileMode.Open);
po = (PurchaseOrder) serializer.Deserialize(fs);
Console.WriteLine ("OrderDate: " + po.OrderDate);
Address shipTo = po.ShipTo;
ReadAddress(shipTo, "Ship To:");
OrderedItem [] items = po.OrderedItems;
Console.WriteLine("Items to be shipped:");
foreach(OrderedItem oi in items)
Console.WriteLine("\t\t\t\t\t Subtotal\t" + po.SubTotal);
Console.WriteLine("\t\t\t\t\t Shipping\t" + po.ShipCost);
Console.WriteLine("\t\t\t\t\t Total\t\t" + po.TotalCost);
protected void ReadAddress(Address a, string label)
Console.WriteLine(label);
Console.WriteLine("\t"+ a.Name );
Console.WriteLine("\t" + a.Line1);
Console.WriteLine("\t" + a.City);
Console.WriteLine("\t" + a.State);
Console.WriteLine("\t" + a.Zip );
private void serializer_UnknownNode
(object sender, XmlNodeEventArgs e)
Console.WriteLine("Unknown Node:" + e.Name + "\t" + e.Text);
private void serializer_UnknownAttribute
(object sender, XmlAttributeEventArgs e)
System.Xml.XmlAttribute attr = e.Attr;
Console.WriteLine("Unknown attribute " +
attr.Name + "='" + attr.Value + "'");