private ContentValidator CompileComplexContent(XmlSchemaComplexType complexType)
 {
     if (complexType.ContentType == XmlSchemaContentType.Empty)
     {
         return ContentValidator.Empty;
     }
     if (complexType.ContentType == XmlSchemaContentType.TextOnly)
     {
         return ContentValidator.TextOnly;
     }
     XmlSchemaParticle contentTypeParticle = complexType.ContentTypeParticle;
     if ((contentTypeParticle == null) || (contentTypeParticle == XmlSchemaParticle.Empty))
     {
         if (complexType.ContentType == XmlSchemaContentType.ElementOnly)
         {
             return ContentValidator.Empty;
         }
         return ContentValidator.Mixed;
     }
     this.PushComplexType(complexType);
     if (contentTypeParticle is XmlSchemaAll)
     {
         XmlSchemaAll all = (XmlSchemaAll) contentTypeParticle;
         AllElementsContentValidator validator = new AllElementsContentValidator(complexType.ContentType, all.Items.Count, all.MinOccurs == 0M);
         for (int i = 0; i < all.Items.Count; i++)
         {
             XmlSchemaElement particle = (XmlSchemaElement) all.Items[i];
             if (!validator.AddElement(particle.QualifiedName, particle, particle.MinOccurs == 0M))
             {
                 base.SendValidationEvent("Sch_DupElement", particle.QualifiedName.ToString(), particle);
             }
         }
         return validator;
     }
     ParticleContentValidator contentValidator = new ParticleContentValidator(complexType.ContentType);
     try
     {
         contentValidator.Start();
         this.BuildParticleContentModel(contentValidator, contentTypeParticle);
         return contentValidator.Finish(this.compileContentModel);
     }
     catch (UpaException exception)
     {
         if (exception.Particle1 is XmlSchemaElement)
         {
             if (exception.Particle2 is XmlSchemaElement)
             {
                 base.SendValidationEvent("Sch_NonDeterministic", ((XmlSchemaElement) exception.Particle1).QualifiedName.ToString(), (XmlSchemaElement) exception.Particle2);
             }
             else
             {
                 base.SendValidationEvent("Sch_NonDeterministicAnyEx", ((XmlSchemaAny) exception.Particle2).NamespaceList.ToString(), ((XmlSchemaElement) exception.Particle1).QualifiedName.ToString(), (XmlSchemaAny) exception.Particle2);
             }
         }
         else if (exception.Particle2 is XmlSchemaElement)
         {
             base.SendValidationEvent("Sch_NonDeterministicAnyEx", ((XmlSchemaAny) exception.Particle1).NamespaceList.ToString(), ((XmlSchemaElement) exception.Particle2).QualifiedName.ToString(), (XmlSchemaAny) exception.Particle1);
         }
         else
         {
             base.SendValidationEvent("Sch_NonDeterministicAnyAny", ((XmlSchemaAny) exception.Particle1).NamespaceList.ToString(), ((XmlSchemaAny) exception.Particle2).NamespaceList.ToString(), (XmlSchemaAny) exception.Particle1);
         }
         return XmlSchemaComplexType.AnyTypeContentValidator;
     }
     catch (NotSupportedException)
     {
         base.SendValidationEvent("Sch_ComplexContentModel", complexType, XmlSeverityType.Warning);
         return XmlSchemaComplexType.AnyTypeContentValidator;
     }
 }
コード例 #2
0
        private ContentValidator CompileComplexContent(XmlSchemaComplexType complexType) {
            if (complexType.ContentType == XmlSchemaContentType.Empty) {
                return ContentValidator.Empty;
            }
            else if (complexType.ContentType == XmlSchemaContentType.TextOnly) {
                return ContentValidator.TextOnly;
            }
            XmlSchemaParticle particle = complexType.ContentTypeParticle;
            if (particle == null || particle == XmlSchemaParticle.Empty) {
                if (complexType.ContentType == XmlSchemaContentType.ElementOnly) {
                    return ContentValidator.Empty;
                }
                else {
                    return ContentValidator.Mixed;
                }
            }
            PushComplexType(complexType);
            if (particle is XmlSchemaAll) {
                XmlSchemaAll all = (XmlSchemaAll)particle;
                AllElementsContentValidator contentValidator = new AllElementsContentValidator(complexType.ContentType, all.Items.Count, all.MinOccurs == decimal.Zero);
                for (int i = 0; i < all.Items.Count; ++i) {
                    XmlSchemaElement localElement = (XmlSchemaElement)all.Items[i];
                    if (!contentValidator.AddElement(localElement.QualifiedName, localElement, localElement.MinOccurs == decimal.Zero)) {
                       SendValidationEvent(Res.Sch_DupElement, localElement.QualifiedName.ToString(), localElement);
                    }
                }
                return contentValidator;
            }
            else {
                ParticleContentValidator contentValidator = new ParticleContentValidator(complexType.ContentType, CompilationSettings.EnableUpaCheck);
#if DEBUG
                string name = complexType.Name != null ? complexType.Name : string.Empty;
                Debug.WriteLineIf(DiagnosticsSwitches.XmlSchema.TraceVerbose, "CompileComplexContent: "+ name  + DumpContentModel(particle));
#endif
                try {
                    contentValidator.Start();
                    complexType.HasWildCard = BuildParticleContentModel(contentValidator, particle);
                    return contentValidator.Finish(true);                         
                }
                catch(UpaException e) {
                    if (e.Particle1 is XmlSchemaElement) {
                        if (e.Particle2 is XmlSchemaElement) {
                            SendValidationEvent(Res.Sch_NonDeterministic, ((XmlSchemaElement)e.Particle1).QualifiedName.ToString(), (XmlSchemaElement)e.Particle2);
                        }
                        else {
                            SendValidationEvent(Res.Sch_NonDeterministicAnyEx, ((XmlSchemaAny)e.Particle2).ResolvedNamespace, ((XmlSchemaElement)e.Particle1).QualifiedName.ToString(), (XmlSchemaAny)e.Particle2);
                        }
                    }
                    else {
                        if (e.Particle2 is XmlSchemaElement) {
                            SendValidationEvent(Res.Sch_NonDeterministicAnyEx, ((XmlSchemaAny)e.Particle1).ResolvedNamespace, ((XmlSchemaElement)e.Particle2).QualifiedName.ToString(), (XmlSchemaElement)e.Particle2);
                        }
                        else {
                            SendValidationEvent(Res.Sch_NonDeterministicAnyAny, ((XmlSchemaAny)e.Particle1).ResolvedNamespace, ((XmlSchemaAny)e.Particle2).ResolvedNamespace, (XmlSchemaAny)e.Particle2);
                        }
                    }
                    return XmlSchemaComplexType.AnyTypeContentValidator;
                }
                catch(NotSupportedException) {
                    SendValidationEvent(Res.Sch_ComplexContentModel, complexType, XmlSeverityType.Warning);
                    return XmlSchemaComplexType.AnyTypeContentValidator;
                }
            }
        }