private object ValidateAttribute(string lName, string ns, XmlValueGetter attributeValueGetter, string attributeStringValue, XmlSchemaInfo schemaInfo) { if (lName == null) { throw new ArgumentNullException("localName"); } if (ns == null) { throw new ArgumentNullException("namespaceUri"); } ValidatorState toState = (this.validationStack.Length > 1) ? ValidatorState.Attribute : ValidatorState.TopLevelAttribute; this.CheckStateTransition(toState, MethodNames[(int) toState]); object typedValue = null; this.attrValid = true; XmlSchemaValidity notKnown = XmlSchemaValidity.NotKnown; XmlSchemaAttribute schemaAttribute = null; XmlSchemaSimpleType xmlType = null; ns = this.nameTable.Add(ns); if (Ref.Equal(ns, this.NsXmlNs)) { return null; } SchemaAttDef def = null; SchemaElementDecl elementDecl = this.context.ElementDecl; XmlQualifiedName key = new XmlQualifiedName(lName, ns); if (this.attPresence[key] != null) { this.SendValidationEvent("Sch_DuplicateAttribute", key.ToString()); if (schemaInfo != null) { schemaInfo.Clear(); } return null; } if (Ref.Equal(ns, this.NsXsi)) { lName = this.nameTable.Add(lName); if ((Ref.Equal(lName, this.xsiTypeString) || Ref.Equal(lName, this.xsiNilString)) || (Ref.Equal(lName, this.xsiSchemaLocationString) || Ref.Equal(lName, this.xsiNoNamespaceSchemaLocationString))) { this.attPresence.Add(key, SchemaAttDef.Empty); } else { this.attrValid = false; this.SendValidationEvent("Sch_NotXsiAttribute", key.ToString()); } } else { AttributeMatchState state2; object obj4; XmlSchemaObject partialValidationType = (this.currentState == ValidatorState.TopLevelAttribute) ? this.partialValidationType : null; def = this.compiledSchemaInfo.GetAttributeXsd(elementDecl, key, partialValidationType, out state2); switch (state2) { case AttributeMatchState.AttributeFound: break; case AttributeMatchState.AnyIdAttributeFound: if (this.wildID != null) { this.SendValidationEvent("Sch_MoreThanOneWildId", string.Empty); } else { this.wildID = def; XmlSchemaComplexType schemaType = elementDecl.SchemaType as XmlSchemaComplexType; if (!schemaType.ContainsIdAttribute(false)) { break; } this.SendValidationEvent("Sch_AttrUseAndWildId", string.Empty); } goto Label_0409; case AttributeMatchState.UndeclaredElementAndAttribute: def = this.CheckIsXmlAttribute(key); if (def != null) { break; } if (((elementDecl != null) || (this.processContents != XmlSchemaContentProcessing.Strict)) || ((key.Namespace.Length == 0) || !this.compiledSchemaInfo.Contains(key.Namespace))) { if (this.processContents != XmlSchemaContentProcessing.Skip) { this.SendValidationEvent("Sch_NoAttributeSchemaFound", key.ToString(), XmlSeverityType.Warning); } } else { this.attrValid = false; this.SendValidationEvent("Sch_UndeclaredAttribute", key.ToString()); } goto Label_0409; case AttributeMatchState.UndeclaredAttribute: def = this.CheckIsXmlAttribute(key); if (def != null) { break; } this.attrValid = false; this.SendValidationEvent("Sch_UndeclaredAttribute", key.ToString()); goto Label_0409; case AttributeMatchState.AnyAttributeLax: this.SendValidationEvent("Sch_NoAttributeSchemaFound", key.ToString(), XmlSeverityType.Warning); goto Label_0409; case AttributeMatchState.ProhibitedAnyAttribute: def = this.CheckIsXmlAttribute(key); if (def != null) { break; } this.attrValid = false; this.SendValidationEvent("Sch_ProhibitedAttribute", key.ToString()); goto Label_0409; case AttributeMatchState.ProhibitedAttribute: this.attrValid = false; this.SendValidationEvent("Sch_ProhibitedAttribute", key.ToString()); goto Label_0409; case AttributeMatchState.AttributeNameMismatch: this.attrValid = false; this.SendValidationEvent("Sch_SchemaAttributeNameMismatch", new string[] { key.ToString(), ((XmlSchemaAttribute) partialValidationType).QualifiedName.ToString() }); goto Label_0409; case AttributeMatchState.ValidateAttributeInvalidCall: this.currentState = ValidatorState.Start; this.attrValid = false; this.SendValidationEvent("Sch_ValidateAttributeInvalidCall", string.Empty); goto Label_0409; default: goto Label_0409; } schemaAttribute = def.SchemaAttribute; if (elementDecl != null) { this.attPresence.Add(key, def); } if (attributeValueGetter != null) { obj4 = attributeValueGetter(); } else { obj4 = attributeStringValue; } typedValue = this.CheckAttributeValue(obj4, def); XmlSchemaDatatype dtype = def.Datatype; if ((dtype.Variety == XmlSchemaDatatypeVariety.Union) && (typedValue != null)) { XsdSimpleValue value2 = typedValue as XsdSimpleValue; xmlType = value2.XmlType; dtype = value2.XmlType.Datatype; typedValue = value2.TypedValue; } this.CheckTokenizedTypes(dtype, typedValue, true); if (this.HasIdentityConstraints) { this.AttributeIdentityConstraints(key.Name, key.Namespace, typedValue, obj4.ToString(), dtype); } } Label_0409: if (!this.attrValid) { notKnown = XmlSchemaValidity.Invalid; } else if (def != null) { notKnown = XmlSchemaValidity.Valid; } if (schemaInfo != null) { schemaInfo.SchemaAttribute = schemaAttribute; schemaInfo.SchemaType = (schemaAttribute == null) ? null : schemaAttribute.AttributeSchemaType; schemaInfo.MemberType = xmlType; schemaInfo.IsDefault = false; schemaInfo.Validity = notKnown; } if (this.ProcessSchemaHints && (this.validatedNamespaces[ns] == null)) { this.validatedNamespaces.Add(ns, ns); } return typedValue; }
private object ValidateAttribute(string lName, string ns, XmlValueGetter attributeValueGetter, string attributeStringValue, XmlSchemaInfo schemaInfo) { if (lName == null) { throw new ArgumentNullException("localName"); } if (ns == null) { throw new ArgumentNullException("namespaceUri"); } ValidatorState toState = validationStack.Length > 1 ? ValidatorState.Attribute : ValidatorState.TopLevelAttribute; CheckStateTransition(toState, MethodNames[(int)toState]); object typedVal = null; attrValid = true; XmlSchemaValidity localValidity = XmlSchemaValidity.NotKnown; XmlSchemaAttribute localAttribute = null; XmlSchemaSimpleType localMemberType = null; ns = nameTable.Add(ns); if(Ref.Equal(ns,NsXmlNs)) { return null; } SchemaAttDef attributeDef = null; SchemaElementDecl currentElementDecl = context.ElementDecl; XmlQualifiedName attQName = new XmlQualifiedName(lName, ns); if (attPresence[attQName] != null) { //this attribute already checked as it is duplicate; SendValidationEvent(Res.Sch_DuplicateAttribute, attQName.ToString()); if (schemaInfo != null) { schemaInfo.Clear(); } return null; } if (!Ref.Equal(ns,NsXsi)) { // XmlSchemaObject pvtAttribute = currentState == ValidatorState.TopLevelAttribute ? partialValidationType : null; AttributeMatchState attributeMatchState; attributeDef = compiledSchemaInfo.GetAttributeXsd(currentElementDecl, attQName, pvtAttribute, out attributeMatchState); switch (attributeMatchState) { case AttributeMatchState.UndeclaredElementAndAttribute: if((attributeDef = CheckIsXmlAttribute(attQName)) != null) { //Try for xml attribute goto case AttributeMatchState.AttributeFound; } if (currentElementDecl == null && processContents == XmlSchemaContentProcessing.Strict && attQName.Namespace.Length != 0 && compiledSchemaInfo.Contains(attQName.Namespace) ) { attrValid = false; SendValidationEvent(Res.Sch_UndeclaredAttribute, attQName.ToString()); } else if (processContents != XmlSchemaContentProcessing.Skip) { SendValidationEvent(Res.Sch_NoAttributeSchemaFound, attQName.ToString(), XmlSeverityType.Warning); } break; case AttributeMatchState.UndeclaredAttribute: if((attributeDef = CheckIsXmlAttribute(attQName)) != null) { goto case AttributeMatchState.AttributeFound; } else { attrValid = false; SendValidationEvent(Res.Sch_UndeclaredAttribute, attQName.ToString()); } break; case AttributeMatchState.ProhibitedAnyAttribute: if((attributeDef = CheckIsXmlAttribute(attQName)) != null) { goto case AttributeMatchState.AttributeFound; } else { attrValid = false; SendValidationEvent(Res.Sch_ProhibitedAttribute, attQName.ToString()); } break; case AttributeMatchState.ProhibitedAttribute: attrValid = false; SendValidationEvent(Res.Sch_ProhibitedAttribute, attQName.ToString()); break; case AttributeMatchState.AttributeNameMismatch: attrValid = false; SendValidationEvent(Res.Sch_SchemaAttributeNameMismatch, new string[] { attQName.ToString(), ((XmlSchemaAttribute)pvtAttribute).QualifiedName.ToString()}); break; case AttributeMatchState.ValidateAttributeInvalidCall: Debug.Assert(currentState == ValidatorState.TopLevelAttribute); //Re-set state back to start on error with partial validation type currentState = ValidatorState.Start; attrValid = false; SendValidationEvent(Res.Sch_ValidateAttributeInvalidCall, string.Empty); break; case AttributeMatchState.AnyIdAttributeFound: if (wildID == null) { wildID = attributeDef; Debug.Assert(currentElementDecl != null); XmlSchemaComplexType ct = currentElementDecl.SchemaType as XmlSchemaComplexType; Debug.Assert(ct != null); if (ct.ContainsIdAttribute(false)) { SendValidationEvent(Res.Sch_AttrUseAndWildId, string.Empty); } else { goto case AttributeMatchState.AttributeFound; } } else { //More than one attribute per element cannot match wildcard if both their types are derived from ID SendValidationEvent(Res.Sch_MoreThanOneWildId, string.Empty); } break; case AttributeMatchState.AttributeFound: Debug.Assert(attributeDef != null); localAttribute = attributeDef.SchemaAttribute; if (currentElementDecl != null) { //Have to add to hashtable to check whether to add default attributes attPresence.Add(attQName, attributeDef); } object attValue; if (attributeValueGetter != null) { attValue = attributeValueGetter(); } else { attValue = attributeStringValue; } typedVal = CheckAttributeValue(attValue, attributeDef); XmlSchemaDatatype datatype = attributeDef.Datatype; if (datatype.Variety == XmlSchemaDatatypeVariety.Union && typedVal != null) { //Unpack the union XsdSimpleValue simpleValue = typedVal as XsdSimpleValue; Debug.Assert(simpleValue != null); localMemberType = simpleValue.XmlType; datatype = simpleValue.XmlType.Datatype; typedVal = simpleValue.TypedValue; } CheckTokenizedTypes(datatype, typedVal, true); if (HasIdentityConstraints) { AttributeIdentityConstraints(attQName.Name, attQName.Namespace, typedVal, attValue.ToString(), datatype); } break; case AttributeMatchState.AnyAttributeLax: SendValidationEvent(Res.Sch_NoAttributeSchemaFound, attQName.ToString(), XmlSeverityType.Warning); break; case AttributeMatchState.AnyAttributeSkip: break; default: break; } } else { //Attribute from xsi namespace lName = nameTable.Add(lName); if (Ref.Equal(lName, xsiTypeString) || Ref.Equal(lName, xsiNilString) || Ref.Equal(lName, xsiSchemaLocationString) || Ref.Equal(lName, xsiNoNamespaceSchemaLocationString)) { attPresence.Add(attQName, SchemaAttDef.Empty); } else { attrValid = false; SendValidationEvent(Res.Sch_NotXsiAttribute, attQName.ToString()); } } if (!attrValid) { localValidity = XmlSchemaValidity.Invalid; } else if (attributeDef != null) { localValidity = XmlSchemaValidity.Valid; } if (schemaInfo != null) { schemaInfo.SchemaAttribute = localAttribute; schemaInfo.SchemaType = localAttribute == null ? null : localAttribute.AttributeSchemaType; schemaInfo.MemberType = localMemberType; schemaInfo.IsDefault = false; schemaInfo.Validity = localValidity; } if (ProcessSchemaHints) { if (validatedNamespaces[ns] == null) { validatedNamespaces.Add(ns, ns); } } return typedVal; }