예제 #1
0
        internal override XmlSchemaParticle GetOptimizedParticle(bool isTop)
        {
            if (OptimizedParticle != null)
            {
                return(OptimizedParticle);
            }
            if (Items.Count == 0 || ValidatedMaxOccurs == 0)
            {
                OptimizedParticle = XmlSchemaParticle.Empty;
                return(OptimizedParticle);
            }
            else if (Items.Count == 1)
            {
                if (ValidatedMinOccurs == 1 && ValidatedMaxOccurs == 1)
                {
                    XmlSchemaSequence seq = new XmlSchemaSequence();
                    this.CopyInfo(seq);
                    XmlSchemaParticle p = (XmlSchemaParticle)Items [0];
                    p = p.GetOptimizedParticle(false);
                    if (p == XmlSchemaParticle.Empty)
                    {
                        OptimizedParticle = p;
                    }
                    else
                    {
                        seq.Items.Add(p);
                        seq.CompiledItems.Add(p);
                        seq.Compile(null, schema);
                        OptimizedParticle = seq;
                    }
                    return(OptimizedParticle);
                }
            }

            XmlSchemaAll all = new XmlSchemaAll();

            CopyInfo(all);
            CopyOptimizedItems(all);
            OptimizedParticle = all;
            all.ComputeEmptiable();

            return(OptimizedParticle);
        }
예제 #2
0
        internal override XmlSchemaParticle GetOptimizedParticle(bool isTop)
        {
            if (this.OptimizedParticle != null)
            {
                return(this.OptimizedParticle);
            }
            if (this.Items.Count == 0 || base.ValidatedMaxOccurs == 0m)
            {
                this.OptimizedParticle = XmlSchemaParticle.Empty;
                return(this.OptimizedParticle);
            }
            if (this.Items.Count == 1 && base.ValidatedMinOccurs == 1m && base.ValidatedMaxOccurs == 1m)
            {
                XmlSchemaSequence xmlSchemaSequence = new XmlSchemaSequence();
                this.CopyInfo(xmlSchemaSequence);
                XmlSchemaParticle xmlSchemaParticle = (XmlSchemaParticle)this.Items[0];
                xmlSchemaParticle = xmlSchemaParticle.GetOptimizedParticle(false);
                if (xmlSchemaParticle == XmlSchemaParticle.Empty)
                {
                    this.OptimizedParticle = xmlSchemaParticle;
                }
                else
                {
                    xmlSchemaSequence.Items.Add(xmlSchemaParticle);
                    xmlSchemaSequence.CompiledItems.Add(xmlSchemaParticle);
                    xmlSchemaSequence.Compile(null, this.schema);
                    this.OptimizedParticle = xmlSchemaSequence;
                }
                return(this.OptimizedParticle);
            }
            XmlSchemaAll xmlSchemaAll = new XmlSchemaAll();

            this.CopyInfo(xmlSchemaAll);
            base.CopyOptimizedItems(xmlSchemaAll);
            this.OptimizedParticle = xmlSchemaAll;
            xmlSchemaAll.ComputeEmptiable();
            return(this.OptimizedParticle);
        }
예제 #3
0
		private void CollectContentTypeFromComplexExtension (ValidationEventHandler h, XmlSchema schema)
		{
			XmlSchemaComplexContentExtension cce = (XmlSchemaComplexContentExtension) ContentModel.Content;
			XmlSchemaComplexType baseComplexType = this.BaseXmlSchemaType as XmlSchemaComplexType;
			if (baseComplexType != null)
				baseComplexType.CollectSchemaComponent (h ,schema);

			// It must exist, but consider validation error case.
			if (BaseSchemaTypeName == XmlSchemaComplexType.AnyTypeName)
				baseComplexType = XmlSchemaComplexType.AnyType;

			// On error case, it simple reject any contents
			if (baseComplexType == null) {
				validatableParticle = XmlSchemaParticle.Empty;
				resolvedContentType = XmlSchemaContentType.Empty;
				return;
			}

			// 3.4.2 complex content {content type}
			if (cce.Particle == null || cce.Particle == XmlSchemaParticle.Empty) {
				// - 2.1
				if (baseComplexType == null) {
					// Basically it is an error. Considering ValidationEventHandler.
					validatableParticle = XmlSchemaParticle.Empty;
					resolvedContentType = XmlSchemaContentType.Empty;
				} else {
					validatableParticle = baseComplexType.ValidatableParticle;
					resolvedContentType = baseComplexType.resolvedContentType;
					// Bug #501814
					if (resolvedContentType == XmlSchemaContentType.Empty)
						resolvedContentType = GetComplexContentType (contentModel);
				}
			} else if (baseComplexType.validatableParticle == XmlSchemaParticle.Empty
				|| baseComplexType == XmlSchemaComplexType.AnyType) {
				// - 2.2
				validatableParticle = cce.Particle;
				resolvedContentType = GetComplexContentType (contentModel);
			} else {
				// - 2.3 : create a new sequences that merges both contents.
				XmlSchemaSequence seq = new XmlSchemaSequence ();
				this.CopyInfo (seq);
				seq.Items.Add (baseComplexType.validatableParticle);
				seq.Items.Add (cce.Particle);
				seq.Compile (h, schema);
				seq.Validate (h, schema);
				validatableParticle = seq;
				resolvedContentType = GetComplexContentType (contentModel);
			}
			if (validatableParticle == null)
				validatableParticle = XmlSchemaParticle.Empty;
		}
예제 #4
0
파일: XmlSchemaAll.cs 프로젝트: nobled/mono
		internal override XmlSchemaParticle GetOptimizedParticle (bool isTop)
		{
			if (OptimizedParticle != null)
				return OptimizedParticle;
			if (Items.Count == 0 || ValidatedMaxOccurs == 0) {
				OptimizedParticle = XmlSchemaParticle.Empty;
				return OptimizedParticle;
			}
			else if (Items.Count == 1) {
				if (ValidatedMinOccurs == 1 && ValidatedMaxOccurs == 1) {
					XmlSchemaSequence seq = new XmlSchemaSequence ();
					this.CopyInfo (seq);
					XmlSchemaParticle p = (XmlSchemaParticle) Items [0];
					p = p.GetOptimizedParticle (false);
					if (p == XmlSchemaParticle.Empty)
						OptimizedParticle = p;
					else {
						seq.Items.Add (p);
						seq.CompiledItems.Add (p);
						seq.Compile (null, schema);
						OptimizedParticle = seq;
					}
					return OptimizedParticle;
				}
			}

			XmlSchemaAll all = new XmlSchemaAll ();
			CopyInfo (all);
			CopyOptimizedItems (all);
			OptimizedParticle = all;
			all.ComputeEmptiable ();

			return OptimizedParticle;
		}