static readonly string xs = "http://www.w3.org/2001/XMLSchema";\r
static Hashtable generatedSchemaTypes;\r
\r
- static void Main (string [] args) \r
+ static void Main (string [] args) \r
{\r
string assembly = args [0];\r
\r
/// <summary>\r
/// Writes a schema for each type in the assembly\r
/// </summary>\r
- static void WriteSchema (string assembly) \r
+ static void WriteSchema (string assembly) \r
{\r
Assembly a = Assembly.LoadFrom (assembly);\r
generatedSchemaTypes = new Hashtable ();\r
/// Given a Type and its associated schema type, add aa '<xs;element>' node \r
/// to the schema.\r
/// </summary>\r
- static XmlSchemaElement WriteSchemaElement (Type type, XmlSchemaType schemaType) \r
+ static XmlSchemaElement WriteSchemaElement (Type type, XmlSchemaType schemaType) \r
{\r
XmlSchemaElement schemaElement = new XmlSchemaElement ();\r
schemaElement.Name = type.Name;\r
return schemaElement;\r
}\r
\r
- static void OnSchemaValidation (object sender, ValidationEventArgs args) \r
+ static void OnSchemaValidation (object sender, ValidationEventArgs args) \r
{\r
Console.WriteLine (args.Message);\r
}\r
/// From a Type, create a corresponding ComplexType node to\r
/// represent this Type.\r
/// </summary>\r
- static XmlSchemaType WriteSchemaType (Type type) \r
+ static XmlSchemaType WriteSchemaType (Type type) \r
{\r
if (generatedSchemaTypes.Contains (type.FullName)) // Caching\r
return generatedSchemaTypes [type.FullName] as XmlSchemaType;\r
return schemaType;\r
}\r
\r
- static XmlSchemaType WriteEnum (Type type) \r
+ static XmlSchemaType WriteEnum (Type type) \r
{\r
if (type.IsEnum == false)\r
throw new Exception (String.Format ("{0} is not an enumeration.", type.Name));\r
return simpleType;\r
}\r
\r
- static XmlSchemaType WriteArray (Type type) \r
+ static XmlSchemaType WriteArray (Type type) \r
{\r
XmlSchemaComplexType complexType = new XmlSchemaComplexType ();\r
string type_name = type.Name.Substring (0, type.Name.Length - 2);\r
element.MinOccurs = 0;\r
element.MaxOccursString = "unbounded";\r
element.IsNillable = true;\r
- element.Name = type_name.ToLower (); \r
- element.SchemaTypeName = GetQualifiedName (\r
- type.FullName.Substring (0, type.FullName.Length - 2));\r
+\r
+ element.Name = type_name.ToLower ();\r
+ XmlQualifiedName qname = GetQualifiedName (\r
+ type.FullName.Substring (0, type.FullName.Length - 2));\r
+\r
+ if (qname == null)\r
+ return null;\r
+ \r
+ element.SchemaTypeName = qname;\r
\r
sequence.Items.Add (element);\r
complexType.Particle = sequence;\r
/// If type is null, it'll create a new complexType \r
/// with an XmlAny node in its sequence child node.\r
/// </summary>\r
- static XmlSchemaType WriteComplexType (Type type) \r
+ static XmlSchemaType WriteComplexType (Type type) \r
{\r
//\r
// Recursively generate schema for all parent types\r
return complexType;\r
} \r
\r
- static XmlSchemaSequence PopulateSequence (FieldInfo [] fields, PropertyInfo [] properties) \r
+ static XmlSchemaSequence PopulateSequence (FieldInfo [] fields, PropertyInfo [] properties) \r
{\r
if (fields == null && properties == null)\r
return null;\r
\r
try {\r
foreach (FieldInfo field in fields)\r
- AddElement (sequence, field, field.FieldType);\r
+ AddElement (sequence, field, field.FieldType);\r
\r
} catch (Exception e) {\r
throw e;\r
\r
try {\r
foreach (PropertyInfo property in properties)\r
- AddElement (sequence, property, property.PropertyType);\r
+ AddElement (sequence, property, property.PropertyType);\r
\r
} catch (ArgumentException e) {\r
throw e;\r
return sequence;\r
}\r
\r
- static void AddElement (XmlSchemaSequence sequence, MemberInfo member, Type type) \r
+ static void AddElement (XmlSchemaSequence sequence, MemberInfo member, Type type) \r
{\r
//\r
// Only read/write properties are supported.\r
if (!type.IsAbstract && typeof (System.Delegate).IsAssignableFrom (type))\r
return;\r
\r
+ //\r
+ // Handle arrays here\r
+ //\r
if (type.IsArray) {\r
XmlSchemaType arrayType = WriteArray (type);\r
- schema.Items.Add (arrayType);\r
+\r
+ if (arrayType == null)\r
+ throw new ArgumentException (String.Format ("The type '{0}' cannot be represented in XML Schema.", type.FullName));\r
+ \r
+ schema.Items.Add (arrayType);\r
}\r
\r
XmlSchemaElement element = new XmlSchemaElement ();\r
sequence.Items.Add (element);\r
}\r
\r
- static XmlQualifiedName GetQualifiedName (Type type) \r
+ static XmlQualifiedName GetQualifiedName (Type type) \r
{\r
if (type.Equals (typeof (System.Xml.XmlNode)))\r
return XmlQualifiedName.Empty;\r
else if (type.IsSubclassOf (typeof (System.Xml.XmlNode)))\r
return new XmlQualifiedName ("xml");\r
\r
- else if (type.IsArray) {\r
+ else if (type.IsArray && (GetQualifiedName (type.FullName) != XmlQualifiedName.Empty)) {\r
string array_type = type.Name.Substring (0, type.Name.Length - 2);\r
return new XmlQualifiedName ("ArrayOf" + array_type);\r
+\r
} else \r
return GetQualifiedName (type.FullName);\r
}\r
///<summary>\r
/// Populates element nodes inside a '<xs:sequence>' node.\r
///</summary>\r
- static XmlQualifiedName GetQualifiedName (string type) \r
+ static XmlQualifiedName GetQualifiedName (string type) \r
{\r
string type_name;\r
\r
switch (type) {\r
- case "System.Uri":\r
- type_name = "anyURI";\r
- break;\r
- case "System.Boolean":\r
- type_name = "Boolean";\r
- break;\r
- case "System.SByte":\r
- type_name = "Byte";\r
- break;\r
- case "System.DateTime":\r
- type_name = "dateTime";\r
- break;\r
- case "System.Decimal":\r
- type_name = "decimal";\r
- break;\r
- case "System.Double":\r
- type_name = "Double";\r
- break;\r
- case "System.Int16":\r
- type_name = "short";\r
- break;\r
- case "System.Int32":\r
- type_name = "int";\r
- break;\r
- case "System.Int64":\r
- type_name = "long";\r
- break;\r
- case "System.Xml.XmlQualifiedName":\r
- type_name = "QName";\r
- break;\r
- case "System.TimeSpan":\r
- type_name = "duration";\r
- break;\r
- case "System.String":\r
- type_name = "string";\r
- break;\r
- case "System.UInt16":\r
- type_name = "unsignedShort";\r
- break;\r
- case "System.UInt32":\r
- type_name = "unsignedInt";\r
- break;\r
- case "System.UInt64":\r
- type_name = "unsignedLong"; \r
- break; \r
- default:\r
- type_name = null;\r
- break;\r
+ case "System.Uri":\r
+ type_name = "anyURI";\r
+ break;\r
+ case "System.Boolean":\r
+ type_name = "Boolean";\r
+ break;\r
+ case "System.SByte":\r
+ type_name = "Byte";\r
+ break;\r
+ case "System.DateTime":\r
+ type_name = "dateTime";\r
+ break;\r
+ case "System.Decimal":\r
+ type_name = "decimal";\r
+ break;\r
+ case "System.Double":\r
+ type_name = "Double";\r
+ break;\r
+ case "System.Int16":\r
+ type_name = "short";\r
+ break;\r
+ case "System.Int32":\r
+ type_name = "int";\r
+ break;\r
+ case "System.Int64":\r
+ type_name = "long";\r
+ break;\r
+ case "System.Xml.XmlQualifiedName":\r
+ type_name = "QName";\r
+ break;\r
+ case "System.TimeSpan":\r
+ type_name = "duration";\r
+ break;\r
+ case "System.String":\r
+ type_name = "string";\r
+ break;\r
+ case "System.UInt16":\r
+ type_name = "unsignedShort";\r
+ break;\r
+ case "System.UInt32":\r
+ type_name = "unsignedInt";\r
+ break;\r
+ case "System.UInt64":\r
+ type_name = "unsignedLong"; \r
+ break; \r
+ default:\r
+ type_name = null;\r
+ break;\r
} \r
\r
if (type_name == null)\r