a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
185 lines
5.3 KiB
C#
185 lines
5.3 KiB
C#
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+"'");
|
|
}
|
|
}
|