2 // mcs/class/System.Data/System.Data/XmlDataLoader.cs
4 // Purpose: Loads XmlDocument to DataSet
6 // class: XmlDataLoader
7 // assembly: System.Data.dll
8 // namespace: System.Data
11 // Ville Palo <vi64pa@koti.soon.fi>
13 // (c)copyright 2002 Ville Palo
15 // XmlDataLoader is included within the Mono Class Library.
21 using System.Xml.XPath;
22 using System.Collections;
23 using System.Globalization;
25 namespace System.Data {
27 internal class XmlDataLoader
31 Hashtable DiffGrRows = new Hashtable ();
33 public XmlDataLoader (DataSet set)
38 public XmlReadMode LoadData (XmlReader reader, XmlReadMode mode)
40 XmlReadMode Result = XmlReadMode.Auto;
44 case XmlReadMode.Fragment:
46 case XmlReadMode.ReadSchema:
47 Result = XmlReadMode.ReadSchema;
48 ReadModeSchema (reader, false);
50 case XmlReadMode.IgnoreSchema:
51 Result = XmlReadMode.IgnoreSchema;
52 ReadModeSchema (reader, true);
54 case XmlReadMode.InferSchema:
55 Result = XmlReadMode.InferSchema;
56 ReadModeInferSchema (reader);
67 // XmlReadMode.InferSchema
69 private void ReadModeInferSchema (XmlReader reader)
71 // root element is DataSets name
72 reader.MoveToContent ();
74 DSet.DataSetName = reader.LocalName;
76 // And now comes tables
77 while (reader.Read ()) {
79 // skip possible inline-schema
80 if (String.Compare (reader.LocalName, "schema", true) == 0 && reader.NodeType == XmlNodeType.Element) {
81 while (reader.Read () && (reader.NodeType != XmlNodeType.EndElement
82 || String.Compare (reader.LocalName, "schema", true) != 0));
86 if (reader.NodeType == XmlNodeType.Element) {
88 string datatablename = reader.LocalName;
90 bool NewTable = false;
92 if (!DSet.Tables.Contains (datatablename)) {
93 table = new DataTable (reader.LocalName);
94 DSet.Tables.Add (table);
98 table = DSet.Tables [datatablename];
101 Hashtable rowValue = new Hashtable ();
103 while (reader.Read () && (reader.NodeType != XmlNodeType.EndElement
104 || reader.LocalName != datatablename))
106 if (reader.NodeType == XmlNodeType.Element) {
108 string dataColumnName = reader.LocalName;
110 table.Columns.Add (dataColumnName);
116 rowValue.Add (dataColumnName, reader.Value);
120 DataRow row = table.NewRow ();
122 IDictionaryEnumerator enumerator = rowValue.GetEnumerator ();
123 while (enumerator.MoveNext ()) {
124 row [enumerator.Key.ToString ()] = enumerator.Value.ToString ();
127 table.Rows.Add (row);
132 // Read Xmldocument. XmlReadMode.ReadSchema and XmlReadMode.IgnoreSchema
134 private void ReadModeSchema (XmlReader reader, bool IgnoreSchema)
137 * Reads any inline schema, but an exception is thrown
138 * if any tables in the inline schema already exist in the DataSet.
141 reader.MoveToContent ();
143 while (reader.Read ()) {
145 // FIXME: possible inline-schema should be readed here
146 if (String.Compare (reader.LocalName, "schema", true) == 0 && reader.NodeType == XmlNodeType.Element) {
148 DSet.ReadXmlSchema (reader);
152 if (reader.NodeType == XmlNodeType.Element && DSet.Tables.Contains (reader.LocalName)) {
154 DataTable table = DSet.Tables [reader.LocalName];
155 DataRow row = table.NewRow ();
157 ReadColumns (reader, row, table, reader.LocalName);
159 table.Rows.Add (row);
164 #endregion // reading
166 #region Private helper methods
168 private void ReadColumns (XmlReader reader, DataRow row, DataTable table, string TableName)
171 if (reader.NodeType == XmlNodeType.Element &&
172 table.Columns.Contains (reader.LocalName)) {
173 string columName = reader.LocalName;
175 row [columName] = reader.Value;
181 } while (table.TableName != reader.LocalName
182 || reader.NodeType != XmlNodeType.EndElement);
185 #endregion // Private helper methods