// Author: Dwivedi, Ajay kumar // Adwiv@Yahoo.com using System; using System.Xml; using System.Xml.Serialization; namespace System.Xml.Schema { /// /// Summary description for XmlSchemaComplexContentRestriction. /// public class XmlSchemaComplexContentRestriction : XmlSchemaContent { private XmlSchemaAnyAttribute any; private XmlSchemaObjectCollection attributes; private XmlQualifiedName baseTypeName; private XmlSchemaParticle particle; private static string xmlname = "restriction"; public XmlSchemaComplexContentRestriction() { baseTypeName = XmlQualifiedName.Empty; attributes = new XmlSchemaObjectCollection(); } [System.Xml.Serialization.XmlAttribute("base")] public XmlQualifiedName BaseTypeName { get{ return baseTypeName; } set{ baseTypeName = value; } } [XmlElement("anyAttribute",Namespace="http://www.w3.org/2001/XMLSchema")] public XmlSchemaAnyAttribute AnyAttribute { get{ return any; } set{ any = value; } } [XmlElement("attribute",typeof(XmlSchemaAttribute),Namespace="http://www.w3.org/2001/XMLSchema")] [XmlElement("attributeGroup",typeof(XmlSchemaAttributeGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")] public XmlSchemaObjectCollection Attributes { get{ return attributes; } } [XmlElement("group",typeof(XmlSchemaGroupRef),Namespace="http://www.w3.org/2001/XMLSchema")] [XmlElement("all",typeof(XmlSchemaAll),Namespace="http://www.w3.org/2001/XMLSchema")] [XmlElement("choice",typeof(XmlSchemaChoice),Namespace="http://www.w3.org/2001/XMLSchema")] [XmlElement("sequence",typeof(XmlSchemaSequence),Namespace="http://www.w3.org/2001/XMLSchema")] public XmlSchemaParticle Particle { get{ return particle; } set{ particle = value; } } /// /// 1. base must be present /// [MonoTODO] internal int Compile(ValidationEventHandler h, XmlSchemaInfo info) { if(BaseTypeName == null || BaseTypeName.IsEmpty) { error(h, "base must be present and a QName"); } else if(!XmlSchemaUtil.CheckQName(BaseTypeName)) error(h,"BaseTypeName is not a valid XmlQualifiedName"); if(this.AnyAttribute != null) { errorCount += AnyAttribute.Compile(h,info); } foreach(XmlSchemaObject obj in Attributes) { if(obj is XmlSchemaAttribute) { XmlSchemaAttribute attr = (XmlSchemaAttribute) obj; errorCount += attr.Compile(h,info); } else if(obj is XmlSchemaAttributeGroupRef) { XmlSchemaAttributeGroupRef atgrp = (XmlSchemaAttributeGroupRef) obj; errorCount += atgrp.Compile(h,info); } else error(h,obj.GetType() +" is not valid in this place::ComplexContentRestriction"); } if(Particle != null) { if(Particle is XmlSchemaGroupRef) { errorCount += ((XmlSchemaGroupRef)Particle).Compile(h,info); } else if(Particle is XmlSchemaAll) { errorCount += ((XmlSchemaAll)Particle).Compile(h,info); } else if(Particle is XmlSchemaChoice) { errorCount += ((XmlSchemaChoice)Particle).Compile(h,info); } else if(Particle is XmlSchemaSequence) { errorCount += ((XmlSchemaSequence)Particle).Compile(h,info); } } XmlSchemaUtil.CompileID(Id,this,info.IDCollection,h); return errorCount; } [MonoTODO] internal int Validate(ValidationEventHandler h) { return errorCount; } // // Content: (annotation?, ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))) // internal static XmlSchemaComplexContentRestriction Read(XmlSchemaReader reader, ValidationEventHandler h) { XmlSchemaComplexContentRestriction restriction = new XmlSchemaComplexContentRestriction(); reader.MoveToElement(); if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname) { error(h,"Should not happen :1: XmlSchemaComplexContentRestriction.Read, name="+reader.Name,null); reader.Skip(); return null; } restriction.LineNumber = reader.LineNumber; restriction.LinePosition = reader.LinePosition; restriction.SourceUri = reader.BaseURI; while(reader.MoveToNextAttribute()) { if(reader.Name == "base") { Exception innerex; restriction.baseTypeName = XmlSchemaUtil.ReadQNameAttribute(reader,out innerex); if(innerex != null) error(h, reader.Value + " is not a valid value for base attribute",innerex); } else if(reader.Name == "id") { restriction.Id = reader.Value; } else if(reader.NamespaceURI == "" || reader.NamespaceURI == XmlSchema.Namespace) { error(h,reader.Name + " is not a valid attribute for restriction",null); } else { if(reader.Prefix == "xmlns") restriction.Namespaces.Add(reader.LocalName, reader.Value); else if(reader.Name == "xmlns") restriction.Namespaces.Add("",reader.Value); //TODO: Add to Unhandled attributes } } reader.MoveToElement(); if(reader.IsEmptyElement) return restriction; //Content: 1. annotation?, // (2.(group | all | choice | sequence)?, (3.(attribute | attributeGroup)*, 4.anyAttribute?))) int level = 1; while(reader.ReadNextElement()) { if(reader.NodeType == XmlNodeType.EndElement) { if(reader.LocalName != xmlname) error(h,"Should not happen :2: XmlSchemaComplexContentRestriction.Read, name="+reader.Name,null); break; } if(level <= 1 && reader.LocalName == "annotation") { level = 2; //Only one annotation XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h); if(annotation != null) restriction.Annotation = annotation; continue; } if(level <= 2) { if(reader.LocalName == "group") { level = 3; XmlSchemaGroupRef group = XmlSchemaGroupRef.Read(reader,h); if(group != null) restriction.particle = group; continue; } if(reader.LocalName == "all") { level = 3; XmlSchemaAll all = XmlSchemaAll.Read(reader,h); if(all != null) restriction.particle = all; continue; } if(reader.LocalName == "choice") { level = 3; XmlSchemaChoice choice = XmlSchemaChoice.Read(reader,h); if(choice != null) restriction.particle = choice; continue; } if(reader.LocalName == "sequence") { level = 3; XmlSchemaSequence sequence = XmlSchemaSequence.Read(reader,h); if(sequence != null) restriction.particle = sequence; continue; } } if(level <= 3) { if(reader.LocalName == "attribute") { level = 3; XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h); if(attr != null) restriction.Attributes.Add(attr); continue; } if(reader.LocalName == "attributeGroup") { level = 3; XmlSchemaAttributeGroupRef attr = XmlSchemaAttributeGroupRef.Read(reader,h); if(attr != null) restriction.attributes.Add(attr); continue; } } if(level <= 4 && reader.LocalName == "anyAttribute") { level = 5; XmlSchemaAnyAttribute anyattr = XmlSchemaAnyAttribute.Read(reader,h); if(anyattr != null) restriction.AnyAttribute = anyattr; continue; } reader.RaiseInvalidElementError(); } return restriction; } } }