1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
// The XmlRootAttribute allows you to set an alterate name
// (PurchaseOrder) for the XML element and its namespace. By
// default, the XmlSerializer uses the class name. The attribute
// also allows you to set the XML namespace for the element. Lastly,
// the attribute sets the IsNullable property, which specifies whether
// the xsi:null attribute appears if the class instance is set to
// a null reference.
[XmlRootAttribute("PurchaseOrder", Namespace="http://cpandl.com",
IsNullable=false)]
public class PurchaseOrder
{
public Address ShipTo;
public string OrderDate;
// The XmlArrayAttribute changes the XML element name
// from the default of "OrderedItems" to "Items".
[XmlArrayAttribute("Items")]
public OrderedItem[] OrderedItems;
public decimal SubTotal;
public decimal ShipCost;
public decimal TotalCost;
}
public class Address
{
// The XmlAttribute instructs the XmlSerializer to serialize the Name
// field as an XML attribute instead of an XML element (the default
// behaviour).
[XmlAttribute]
public string Name;
public string Line1;
// Setting the IsNullable property to false instructs the
// XmlSerializer that the XML attribute will not appear if
// the City field is set to a null reference.
[XmlElementAttribute(IsNullable=false)]
public string City;
public string State;
public string Zip;
}
public class OrderedItem
{
public string ItemName;
public string Description;
public decimal UnitPrice;
public int Quantity;
public decimal LineTotal;
// Calculate is a custom method that calculates the price per item
// and stores the value in a field.
public void Calculate()
{
LineTotal=UnitPrice*Quantity;
}
}
public class Test
{
public static void Main()
{
// Read and write purchase orders.
Test t=new Test();
t.CreatePO("potest.xml");
t.ReadPO("potest.xml");
}
private void CreatePO(string filename)
{
// Creates an instance of the XmlSerializer class;
// specifies the type of object to serialize.
XmlSerializer serializer=new XmlSerializer(typeof(PurchaseOrder));
TextWriter writer=new StreamWriter(filename);
PurchaseOrder po=new PurchaseOrder();
// Creates an address to ship and bill to.
Address billAddress=new Address();
billAddress.Name="Teresa Atkinson";
billAddress.Line1="1 Main St.";
billAddress.City="AnyTown";
billAddress.State="WA";
billAddress.Zip="00000";
// Sets ShipTo and BillTo to the same addressee.
po.ShipTo=billAddress;
po.OrderDate=System.DateTime.Now.ToLongDateString();
// Creates an OrderedItem.
OrderedItem i1=new OrderedItem();
i1.ItemName="Widget S";
i1.Description="Small widget";
i1.UnitPrice=(decimal)5.23;
i1.Quantity=3;
i1.Calculate();
// Inserts the item into the array.
OrderedItem[] items={i1};
po.OrderedItems=items;
// Calculate the total cost.
decimal subTotal=new decimal();
foreach(OrderedItem oi in items)
{
subTotal+=oi.LineTotal;
}
po.SubTotal=subTotal;
po.ShipCost=(decimal)12.51;
po.TotalCost=po.SubTotal+po.ShipCost;
// Serializes the purchase order, and closes the TextWriter.
serializer.Serialize(writer, po);
writer.Close();
}
protected void ReadPO(string filename)
{
// Creates an instance of the XmlSerializer class;
// specifies the type of object to be deserialized.
XmlSerializer serializer=new XmlSerializer(typeof(PurchaseOrder));
// If the XML document has been altered with unknown
// nodes or attributes, handles them with the
// UnknownNode and UnknownAttribute events.
serializer.UnknownNode+=new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute+=new XmlAttributeEventHandler(serializer_UnknownAttribute);
// A FileStream is needed to read the XML document.
FileStream fs=new FileStream(filename, FileMode.Open);
// Declares an object variable of the type to be deserialized.
PurchaseOrder po;
// Uses the Deserialize method to restore the object's state with
// data from the XML document. */
po=(PurchaseOrder)serializer.Deserialize(fs);
fs.Close();
// Reads the order date.
Console.WriteLine("OrderDate: "+po.OrderDate);
// Reads the shipping address.
Address shipTo=po.ShipTo;
ReadAddress(shipTo, "Ship To:");
// Reads the list of ordered items.
OrderedItem[] items=po.OrderedItems;
Console.WriteLine("Items to be shipped:");
foreach(OrderedItem oi in items)
{
Console.WriteLine("\t"+
oi.ItemName+"\t"+
oi.Description+"\t"+
oi.UnitPrice+"\t"+
oi.Quantity+"\t"+
oi.LineTotal);
}
// Reads the subtotal, shipping cost, and total cost.
Console.WriteLine("\n\t\t\t\t\t Subtotal\t"+po.SubTotal+
"\n\t\t\t\t\t Shipping\t"+po.ShipCost+
"\n\t\t\t\t\t Total\t\t"+po.TotalCost);
}
protected void ReadAddress(Address a, string label)
{
// Reads the fields of the Address.
Console.WriteLine(label);
Console.Write("\t"+
a.Name+"\n\t"+
a.Line1+"\n\t"+
a.City+"\t"+
a.State+"\n\t"+
a.Zip+"\n");
}
protected void serializer_UnknownNode(object sender,
XmlNodeEventArgs e)
{
Console.WriteLine("Unknown Node:"+e.Name+"\t"+e.Text);
}
protected void serializer_UnknownAttribute(object sender,
XmlAttributeEventArgs e)
{
System.Xml.XmlAttribute attr=e.Attr;
Console.WriteLine("Unknown attribute "+attr.Name+"='"+attr.Value+"'");
}
}
|