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