Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

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