File: potest.cs

package info (click to toggle)
mono-reference-assemblies 3.12.1%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 604,240 kB
  • ctags: 625,505
  • sloc: cs: 3,967,741; xml: 2,793,081; ansic: 418,042; java: 60,435; sh: 14,833; makefile: 11,576; sql: 7,956; perl: 1,467; cpp: 1,446; yacc: 1,203; python: 598; asm: 422; sed: 16; php: 1
file content (184 lines) | stat: -rw-r--r-- 5,452 bytes parent folder | download | duplicates (17)
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+"'");
	}
}