// Author: Dwivedi, Ajay kumar // Adwiv@Yahoo.com using System; using System.Xml.Serialization; using System.Xml; namespace System.Xml.Schema { /// /// Summary description for XmlSchemaSimpleType. /// public class XmlSchemaSimpleType : XmlSchemaType { private XmlSchemaSimpleTypeContent content; //compilation vars internal bool islocal = false; private bool errorOccured = false; public XmlSchemaSimpleType() { } [XmlElement("restriction",typeof(XmlSchemaSimpleTypeRestriction),Namespace="http://www.w3.org/2001/XMLSchema")] [XmlElement("list",typeof(XmlSchemaSimpleTypeList),Namespace="http://www.w3.org/2001/XMLSchema")] [XmlElement("union",typeof(XmlSchemaSimpleTypeUnion),Namespace="http://www.w3.org/2001/XMLSchema")] public XmlSchemaSimpleTypeContent Content { get{ return content; } set{ content = value; } } /// /// For a simple Type: /// a) If the simpletype is local /// 1- are from and /// 1. name is prohibited /// 2. final is prohibited /// 3. group of simplederivation (Content) is required. /// b) If the simpletype is toplevel /// 1- are from and /// 1. name is required, type must be NCName /// 2. Content is required /// 3. final can have values : #all | (list | union | restriction) /// 4. If final is set, finalResolved is same as final (but within the values of b.3) /// 5. If final is not set, the finalDefault of the schema (but within the values of b.3) /// 6. Base type is: /// 4.1 If restriction is chosen,the base type of restriction or elements /// 4.2 otherwise simple ur-type /// [MonoTODO] internal bool Compile(ValidationEventHandler h, XmlSchemaInfo info) { if(this.islocal) // a { if(this.Name != null) // a.1 error(h,"Name is prohibited in a local simpletype"); if(this.Final != XmlSchemaDerivationMethod.None) //a.2 error(h,"Final is prohibited in a local simpletype"); } else //b { if(this.Name == null) //b.1 error(h,"Name is required in top level simpletype"); // FIXME: A better way to check NCName? Something like IsNCName()? else if(this.Name.IndexOf(":") != -1) // b.1.2 error(h,"attribute name must be NCName"); else this.qName = new XmlQualifiedName(this.Name,info.targetNS);//Add target namespace XmlSchemaDerivationMethod finaltmp; if(this.Final != XmlSchemaDerivationMethod.None) { finaltmp = this.Final; } else { finaltmp = info.finalDefault; } switch(finaltmp) //b.3, b.4, b.5 { case XmlSchemaDerivationMethod.Substitution: error(h,"substition is not a valid value for final in a simpletype"); break; case XmlSchemaDerivationMethod.Extension: error(h,"extension is not a valid value for final in a simpletype"); break; case XmlSchemaDerivationMethod.Union: error(h,"union is not a valid value for final in simpletype"); break; default: this.finalResolved = this.Final; break; } } if(this.Content == null) //a.3,b.2 error(h,"Content is required in a local simpletype"); if(Content is XmlSchemaSimpleTypeRestriction) { ((XmlSchemaSimpleTypeRestriction)Content).Compile(h,info); } else if(Content is XmlSchemaSimpleTypeList) { ((XmlSchemaSimpleTypeList)Content).Compile(h,info); } else if(Content is XmlSchemaSimpleTypeUnion) { ((XmlSchemaSimpleTypeUnion)Content).Compile(h,info); } return errorOccured; } [MonoTODO] internal bool Validate(ValidationEventHandler h) { return false; } internal void error(ValidationEventHandler handle,string message) { this.errorOccured = true; ValidationHandler.RaiseValidationError(handle,this,message); } } }