private bool BuildParticleContentModel(ParticleContentValidator contentValidator, XmlSchemaParticle particle) {
bool hasWildCard = false;
if (particle is XmlSchemaElement) {
XmlSchemaElement element = (XmlSchemaElement)particle;
contentValidator.AddName(element.QualifiedName, element);
}
else if (particle is XmlSchemaAny) {
hasWildCard = true;
XmlSchemaAny any = (XmlSchemaAny)particle;
contentValidator.AddNamespaceList(any.NamespaceList, any);
}
else if (particle is XmlSchemaGroupBase) {
XmlSchemaObjectCollection particles = ((XmlSchemaGroupBase)particle).Items;
bool isChoice = particle is XmlSchemaChoice;
contentValidator.OpenGroup();
bool first = true;
foreach (XmlSchemaParticle p in particles) {
Debug.Assert(!p.IsEmpty);
if (first) {
first = false;
}
else if (isChoice) {
contentValidator.AddChoice();
}
else {
contentValidator.AddSequence();
}
hasWildCard = BuildParticleContentModel(contentValidator, p);
}
contentValidator.CloseGroup();
}
else {
Debug.Assert(false);
}
if (particle.MinOccurs == decimal.One && particle.MaxOccurs == decimal.One) {
// nothing
}
else if (particle.MinOccurs == decimal.Zero && particle.MaxOccurs == decimal.One) {
contentValidator.AddQMark();
}
else if (particle.MinOccurs == decimal.Zero && particle.MaxOccurs == decimal.MaxValue) {
contentValidator.AddStar();
}
else if (particle.MinOccurs == decimal.One && particle.MaxOccurs == decimal.MaxValue) {
contentValidator.AddPlus();
}
else {
contentValidator.AddLeafRange(particle.MinOccurs, particle.MaxOccurs);
}
return hasWildCard;
}