private void ProcessDataTableElement (XmlSchemaElement el)
{
string tableName = XmlHelper.Decode (el.QualifiedName.Name);
// If it is already registered, just ignore.
if (dataset.Tables.Contains (tableName))
return;
DataTable table = new DataTable (tableName);
table.Namespace = el.QualifiedName.Namespace;
TableStructure oldTable = currentTable;
currentTable = new TableStructure (table);
dataset.Tables.Add (table);
// Find Locale
if (el.UnhandledAttributes != null) {
foreach (XmlAttribute attr in el.UnhandledAttributes) {
if (attr.NamespaceURI == XmlConstants.MspropNamespace) {
table.ExtendedProperties.Add (attr.Name, attr.Value);
continue;
}
if (attr.LocalName == "Locale" &&
attr.NamespaceURI == XmlConstants.MsdataNamespace)
table.Locale = new CultureInfo (attr.Value);
}
}
// Handle complex type (NOTE: It is (or should be)
// impossible the type is other than complex type).
XmlSchemaComplexType ct = null;
#if NET_2_0
ct = (XmlSchemaComplexType) el.ElementSchemaType;
#else
ct = (XmlSchemaComplexType) el.ElementType;
#endif
// Handle attributes
foreach (DictionaryEntry de in ct.AttributeUses)
ImportColumnAttribute ((XmlSchemaAttribute) de.Value);
// Handle content type particle
if (ct.ContentTypeParticle is XmlSchemaElement)
ImportColumnElement (el, (XmlSchemaElement) ct.ContentTypeParticle);
else if (ct.ContentTypeParticle is XmlSchemaGroupBase)
ImportColumnGroupBase (el, (XmlSchemaGroupBase) ct.ContentTypeParticle);
// else if null then do nothing.
// Handle simple content
switch (ct.ContentType) {
case XmlSchemaContentType.TextOnly:
// case XmlSchemaContentType.Mixed:
// LAMESPEC: When reading from XML Schema, it maps to "_text", while on the data inference, it is mapped to "_Text" (case ignorant).
string simpleName = el.QualifiedName.Name + "_text";
DataColumn simple = new DataColumn (simpleName);
simple.Namespace = el.QualifiedName.Namespace;
simple.AllowDBNull = (el.MinOccurs == 0);
simple.ColumnMapping = MappingType.SimpleContent;
simple.DataType = ConvertDatatype (ct.Datatype);
currentTable.NonOrdinalColumns.Add (simple);
break;
}
// add columns to the table in specified order
// (by msdata:Ordinal attributes)
SortedList sd = new SortedList ();
foreach (DictionaryEntry de in currentTable.OrdinalColumns)
sd.Add (de.Value, de.Key);
foreach (DictionaryEntry de in sd)
table.Columns.Add ((DataColumn) de.Value);
foreach (DataColumn dc in currentTable.NonOrdinalColumns)
table.Columns.Add (dc);
currentTable = oldTable;
}