예제 #1
0
        internal override bool ParticleEquals(XmlSchemaParticle other)
        {
            XmlSchemaGroupBase gb = other as XmlSchemaGroupBase;

            if (gb == null)
            {
                return(false);
            }
            if (this.GetType() != gb.GetType())
            {
                return(false);
            }

            if (this.ValidatedMaxOccurs != gb.ValidatedMaxOccurs ||
                this.ValidatedMinOccurs != gb.ValidatedMinOccurs)
            {
                return(false);
            }
            if (this.CompiledItems.Count != gb.CompiledItems.Count)
            {
                return(false);
            }
            for (int i = 0; i < CompiledItems.Count; i++)
            {
                XmlSchemaParticle p1 = this.CompiledItems [i] as XmlSchemaParticle;
                XmlSchemaParticle p2 = gb.CompiledItems [i] as XmlSchemaParticle;
                if (!p1.ParticleEquals(p2))
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #2
0
 internal void CopyOptimizedItems(XmlSchemaGroupBase gb)
 {
     for (int i = 0; i < Items.Count; i++)
     {
         XmlSchemaParticle p = Items [i] as XmlSchemaParticle;
         p = p.GetOptimizedParticle(false);
         if (p == XmlSchemaParticle.Empty)
         {
             continue;
         }
         gb.Items.Add(p);
         gb.CompiledItems.Add(p);
     }
 }
예제 #3
0
        internal bool ValidateSeqRecurseMapSumCommon(XmlSchemaGroupBase baseGroup,
                                                     ValidationEventHandler h, XmlSchema schema, bool isLax, bool isMapAndSum, bool raiseError)
        {
            int     index       = 0;
            int     baseIndex   = 0;
            decimal baseOccured = 0;

            if (baseGroup.CompiledItems.Count == 0 && this.CompiledItems.Count > 0)
            {
                if (raiseError)
                {
                    error(h, "Invalid particle derivation by restriction was found. base particle does not contain particles.");
                }
                return(false);
            }

            for (int i = 0; i < CompiledItems.Count; i++)
            {
                // get non-empty derived particle
                XmlSchemaParticle pd = null;
                while (this.CompiledItems.Count > index)
                {
                    pd = ((XmlSchemaParticle)this.CompiledItems [index]); //.GetOptimizedParticle (false);
                    if (pd != XmlSchemaParticle.Empty)                    // && pd.ValidatedMaxOccurs > 0)
                    {
                        break;
                    }
                    else
                    {
                        index++;
                    }
                }
                if (index >= CompiledItems.Count)
                {
                    if (raiseError)
                    {
                        error(h, "Invalid particle derivation by restriction was found. Cannot be mapped to base particle.");
                    }
                    return(false);
                }

                // get non-empty base particle
                XmlSchemaParticle pb = null;
                while (baseGroup.CompiledItems.Count > baseIndex)
                {
                    pb = ((XmlSchemaParticle)baseGroup.CompiledItems [baseIndex]);                     //.GetOptimizedParticle (false);
                    if (pb == XmlSchemaParticle.Empty && pb.ValidatedMaxOccurs > 0)
                    {
                        continue;
                    }
                    if (!pd.ValidateDerivationByRestriction(pb, h, schema, false))
                    {
                        if (!isLax && !isMapAndSum && pb.MinOccurs > baseOccured && !pb.ValidateIsEmptiable())
                        {
                            if (raiseError)
                            {
                                error(h, "Invalid particle derivation by restriction was found. Invalid sub-particle derivation was found.");
                            }
                            return(false);
                        }
                        else
                        {
                            baseOccured = 0;
                            baseIndex++;
                        }
                    }
                    else
                    {
                        baseOccured += pb.ValidatedMinOccurs;
                        if (baseOccured >= baseGroup.ValidatedMaxOccurs)
                        {
                            baseOccured = 0;
                            baseIndex++;
                        }
                        index++;
                        break;
                    }
                }
            }
            if (this.CompiledItems.Count > 0 && index != this.CompiledItems.Count)
            {
                if (raiseError)
                {
                    error(h, "Invalid particle derivation by restriction was found. Extraneous derived particle was found.");
                }
                return(false);
            }
            if (!isLax && !isMapAndSum)
            {
                if (baseOccured > 0)
                {
                    baseIndex++;
                }
                for (int i = baseIndex; i < baseGroup.CompiledItems.Count; i++)
                {
                    XmlSchemaParticle p = baseGroup.CompiledItems [i] as XmlSchemaParticle;
                    if (!p.ValidateIsEmptiable())
                    {
                        if (raiseError)
                        {
                            error(h, "Invalid particle derivation by restriction was found. There is a base particle which does not have mapped derived particle and is not emptiable.");
                        }
                        return(false);
                    }
                }
            }
            return(true);
        }
예제 #4
0
 internal bool ValidateRecurse(XmlSchemaGroupBase baseGroup,
                               ValidationEventHandler h, XmlSchema schema, bool raiseError)
 {
     return(ValidateSeqRecurseMapSumCommon(baseGroup, h, schema, false, false, raiseError));
 }