using System;
using System.Data;
using System.Xml;
+using System.Xml.Schema;
using System.Xml.XPath;
using System.Collections;
using System.Globalization;
private void LoadCurrent (XmlReader reader)
{
if (reader.IsEmptyElement) {
- reader.Skip ();
+ reader.Skip();
return;
}
reader.ReadStartElement (); // Dataset root
reader.ReadEndElement ();
}
- private void LoadColumns (DataTable Table, DataRow Row, XmlReader reader, DataRowVersion loadType)
+ private void LoadColumns (DataTable Table, DataRow Row,
+ XmlReader reader, DataRowVersion loadType)
+ {
+ // attributes
+ LoadColumnAttributes (Table, Row, reader, loadType);
+ LoadColumnChildren (Table, Row, reader, loadType);
+ }
+
+ private void LoadColumnAttributes (DataTable Table, DataRow Row,
+ XmlReader reader, DataRowVersion loadType)
+ {
+ if (!reader.HasAttributes // this check will be faster
+ || !reader.MoveToFirstAttribute ())
+ return;
+ do {
+ switch (reader.NamespaceURI) {
+ case XmlConstants.XmlnsNS:
+ case XmlConstants.DiffgrNamespace:
+ case XmlConstants.MsdataNamespace:
+ case XmlConstants.MspropNamespace:
+ case XmlSchema.Namespace:
+ continue;
+ }
+ DataColumn c = Table.Columns [reader.LocalName];
+ if (c == null ||
+ c.ColumnMapping != MappingType.Attribute) continue;
+ if (c.Namespace == null && reader.NamespaceURI == String.Empty ||
+ c.Namespace == reader.NamespaceURI) {
+ object data = XmlDataLoader.StringToObject (c.DataType, reader.Value);
+ if (loadType == DataRowVersion.Current)
+ Row [c] = data;
+ else
+ Row.SetOriginalValue (c.ColumnName, data);
+ } // otherwise just ignore as well as unknown elements.
+ } while (reader.MoveToNextAttribute ());
+ reader.MoveToElement ();
+ }
+
+ private void LoadColumnChildren (DataTable Table, DataRow Row,
+ XmlReader reader, DataRowVersion loadType)
{
+ // children
if (reader.IsEmptyElement) {
reader.Skip ();
return;
LoadBeforeTable (t, reader);
else if (loadType == DataRowVersion.Current)
LoadCurrentTable (t, reader);
- }
+ } else
+ reader.Skip ();
}
}