| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- 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+"'");
- }
- }
|