private void CalculateEffectiveTotalRange(XmlSchemaParticle particle, out decimal minOccurs, out decimal maxOccurs) {
if (particle is XmlSchemaElement || particle is XmlSchemaAny) {
minOccurs = particle.MinOccurs;
maxOccurs = particle.MaxOccurs;
}
else if (particle is XmlSchemaChoice) {
if (((XmlSchemaChoice)particle).Items.Count == 0) {
minOccurs = maxOccurs = decimal.Zero;
}
else {
minOccurs = decimal.MaxValue;
maxOccurs = decimal.Zero;
foreach (XmlSchemaParticle p in ((XmlSchemaChoice)particle).Items) {
decimal min, max;
CalculateEffectiveTotalRange(p, out min, out max);
if (min < minOccurs) {
minOccurs = min;
}
if (max > maxOccurs) {
maxOccurs = max;
}
}
minOccurs *= particle.MinOccurs;
if (maxOccurs != decimal.MaxValue) {
if (particle.MaxOccurs == decimal.MaxValue)
maxOccurs = decimal.MaxValue;
else
maxOccurs *= particle.MaxOccurs;
}
}
}
else {
XmlSchemaObjectCollection collection = ((XmlSchemaGroupBase)particle).Items;
if (collection.Count == 0) {
minOccurs = maxOccurs = decimal.Zero;
}
else {
minOccurs = 0;
maxOccurs = 0;
foreach (XmlSchemaParticle p in collection) {
decimal min, max;
CalculateEffectiveTotalRange(p, out min, out max);
minOccurs += min;
if (maxOccurs != decimal.MaxValue) {
if (max == decimal.MaxValue)
maxOccurs = decimal.MaxValue;
else
maxOccurs += max;
}
}
minOccurs *= particle.MinOccurs;
if (maxOccurs != decimal.MaxValue) {
if (particle.MaxOccurs == decimal.MaxValue)
maxOccurs = decimal.MaxValue;
else
maxOccurs *= particle.MaxOccurs;
}
}
}
}