private void CompileComplexType(XmlSchemaComplexType complexType) { if (complexType.ElementDecl != null) { //already compiled return; } if (complexType.IsProcessing) { SendValidationEvent(Res.Sch_TypeCircularRef, complexType); return; } complexType.IsProcessing = true; try { if (complexType.ContentModel != null) { //simpleContent or complexContent if (complexType.ContentModel is XmlSchemaSimpleContent) { XmlSchemaSimpleContent simpleContent = (XmlSchemaSimpleContent)complexType.ContentModel; complexType.SetContentType(XmlSchemaContentType.TextOnly); if (simpleContent.Content is XmlSchemaSimpleContentExtension) { CompileSimpleContentExtension(complexType, (XmlSchemaSimpleContentExtension)simpleContent.Content); } else { //simpleContent.Content is XmlSchemaSimpleContentRestriction CompileSimpleContentRestriction(complexType, (XmlSchemaSimpleContentRestriction)simpleContent.Content); } } else { // complexType.ContentModel is XmlSchemaComplexContent XmlSchemaComplexContent complexContent = (XmlSchemaComplexContent)complexType.ContentModel; if (complexContent.Content is XmlSchemaComplexContentExtension) { CompileComplexContentExtension(complexType, complexContent, (XmlSchemaComplexContentExtension)complexContent.Content); } else { // complexContent.Content is XmlSchemaComplexContentRestriction CompileComplexContentRestriction(complexType, complexContent, (XmlSchemaComplexContentRestriction)complexContent.Content); } } } else { //equals XmlSchemaComplexContent with baseType is anyType complexType.SetBaseSchemaType(XmlSchemaComplexType.AnyType); CompileLocalAttributes(XmlSchemaComplexType.AnyType, complexType, complexType.Attributes, complexType.AnyAttribute, XmlSchemaDerivationMethod.Restriction); complexType.SetDerivedBy(XmlSchemaDerivationMethod.Restriction); complexType.SetContentTypeParticle(CompileContentTypeParticle(complexType.Particle)); complexType.SetContentType(GetSchemaContentType(complexType, null, complexType.ContentTypeParticle)); } if (complexType.ContainsIdAttribute(true)) { SendValidationEvent(Res.Sch_TwoIdAttrUses, complexType); } SchemaElementDecl decl = new SchemaElementDecl(); decl.ContentValidator = CompileComplexContent(complexType); decl.SchemaType = complexType; decl.IsAbstract = complexType.IsAbstract; decl.Datatype = complexType.Datatype; decl.Block = complexType.BlockResolved; decl.AnyAttribute = complexType.AttributeWildcard; foreach(XmlSchemaAttribute attribute in complexType.AttributeUses.Values) { if (attribute.Use == XmlSchemaUse.Prohibited) { if (!decl.ProhibitedAttributes.ContainsKey(attribute.QualifiedName)) { decl.ProhibitedAttributes.Add(attribute.QualifiedName, attribute.QualifiedName); } } else { if (!decl.AttDefs.ContainsKey(attribute.QualifiedName) && attribute.AttDef != null && attribute.AttDef.Name != XmlQualifiedName.Empty && attribute.AttDef != SchemaAttDef.Empty) { decl.AddAttDef(attribute.AttDef); } } } complexType.ElementDecl = decl; } finally { complexType.IsProcessing = false; } }
private void CompileComplexType(XmlSchemaComplexType complexType) { if (complexType.ElementDecl == null) { if (complexType.IsProcessing) { base.SendValidationEvent("Sch_TypeCircularRef", complexType); } else { complexType.IsProcessing = true; try { if (complexType.ContentModel != null) { if (complexType.ContentModel is XmlSchemaSimpleContent) { XmlSchemaSimpleContent contentModel = (XmlSchemaSimpleContent) complexType.ContentModel; complexType.SetContentType(XmlSchemaContentType.TextOnly); if (contentModel.Content is XmlSchemaSimpleContentExtension) { this.CompileSimpleContentExtension(complexType, (XmlSchemaSimpleContentExtension) contentModel.Content); } else { this.CompileSimpleContentRestriction(complexType, (XmlSchemaSimpleContentRestriction) contentModel.Content); } } else { XmlSchemaComplexContent complexContent = (XmlSchemaComplexContent) complexType.ContentModel; if (complexContent.Content is XmlSchemaComplexContentExtension) { this.CompileComplexContentExtension(complexType, complexContent, (XmlSchemaComplexContentExtension) complexContent.Content); } else { this.CompileComplexContentRestriction(complexType, complexContent, (XmlSchemaComplexContentRestriction) complexContent.Content); } } } else { complexType.SetBaseSchemaType(XmlSchemaComplexType.AnyType); this.CompileLocalAttributes(XmlSchemaComplexType.AnyType, complexType, complexType.Attributes, complexType.AnyAttribute, XmlSchemaDerivationMethod.Restriction); complexType.SetDerivedBy(XmlSchemaDerivationMethod.Restriction); complexType.SetContentTypeParticle(this.CompileContentTypeParticle(complexType.Particle)); complexType.SetContentType(this.GetSchemaContentType(complexType, null, complexType.ContentTypeParticle)); } if (complexType.ContainsIdAttribute(true)) { base.SendValidationEvent("Sch_TwoIdAttrUses", complexType); } SchemaElementDecl decl = new SchemaElementDecl { ContentValidator = this.CompileComplexContent(complexType), SchemaType = complexType, IsAbstract = complexType.IsAbstract, Datatype = complexType.Datatype, Block = complexType.BlockResolved, AnyAttribute = complexType.AttributeWildcard }; foreach (XmlSchemaAttribute attribute in complexType.AttributeUses.Values) { if (attribute.Use == XmlSchemaUse.Prohibited) { if (!decl.ProhibitedAttributes.ContainsKey(attribute.QualifiedName)) { decl.ProhibitedAttributes.Add(attribute.QualifiedName, attribute.QualifiedName); } } else if ((!decl.AttDefs.ContainsKey(attribute.QualifiedName) && (attribute.AttDef != null)) && ((attribute.AttDef.Name != XmlQualifiedName.Empty) && (attribute.AttDef != SchemaAttDef.Empty))) { decl.AddAttDef(attribute.AttDef); } } complexType.ElementDecl = decl; } finally { complexType.IsProcessing = false; } } } }