public static bool HasFacetRestrictions(this XmlSchemaComplexType ct) { if (ct.GetContentType() == XmlSchemaContentType.TextOnly) { XmlSchemaSimpleType baseType = ct.BaseXmlSchemaType as XmlSchemaSimpleType; if (baseType != null) //Derived from Simple type, first step simpleContent extension { return(baseType.HasFacetRestrictions()); } else if (ct.IsDerivedByRestriction()) //derived from another complex type, simple content restriction { return(true); } } return(false); }
public static bool HasFacetRestrictions(this XmlSchemaComplexType ct) { bool flag; if (ct.GetContentType() == XmlSchemaContentType.TextOnly) { XmlSchemaSimpleType baseType = ct.BaseXmlSchemaType as XmlSchemaSimpleType; if (baseType != null) { flag = baseType.HasFacetRestrictions(); return(flag); } else if (ct.IsDerivedByRestriction()) { flag = true; return(flag); } } flag = false; return(flag); }
private ClrPropertyInfo BuildComplexTypeTextProperty(XmlSchemaElement parentElement, XmlSchemaComplexType schemaType) { Debug.Assert(schemaType != null); Debug.Assert(schemaType.GetContentType() == XmlSchemaContentType.TextOnly); ClrPropertyInfo textProperty = new ClrPropertyInfo(Constants.SInnerTypePropertyName, string.Empty, Constants.SInnerTypePropertyName, Occurs.One); textProperty.Origin = SchemaOrigin.Text; ClrTypeReference typeRef = null; bool anonymous = false; //Could be derived by restriction or extension //If first time extension, make the base simple type as the type reference XmlSchemaType baseType = schemaType.BaseXmlSchemaType; if (baseType is XmlSchemaSimpleType) { typeRef = BuildTypeReference(baseType, baseType.QualifiedName, false, true); anonymous = false; if (!textPropInheritanceTracker.ContainsKey(schemaType)) { textPropInheritanceTracker.Add(schemaType, textProperty); } } else if (schemaType.HasFacetRestrictions()) { //Derived by restriction, represents the content type with restrictions as a local type //Make the base simple type as the type reference so that we know if it is a list, union or atomic XmlSchemaSimpleType st = schemaType.GetBaseSimpleType(); Debug.Assert(st != null); typeRef = BuildTypeReference(st, st.QualifiedName, true, true); typeRef.Validate = true; anonymous = true; //Also get its base complex type and see if we need to override the content property ClrPropertyInfo baseProp = null; if (textPropInheritanceTracker.TryGetValue(baseType, out baseProp)) { textProperty.IsOverride = true; if (!baseProp.IsOverride) { baseProp.IsVirtual = true; } } } else { return(null); } if (anonymous) { //anonymous type, fixed up the name later, treat complex type with restrictions as an anonymous type //because we need to generate a type to encapsualte these restrictions if (parentElement != null) { string identifier = localSymbolTable.AddLocalElement(parentElement); localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef); } else { localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef); } } textProperty.TypeReference = typeRef; return(textProperty); }
private void BuildNestedTypes(ClrContentTypeInfo typeInfo) { List <AnonymousType> anonymousTypes = localSymbolTable.GetAnonymousTypes(); foreach (AnonymousType at in anonymousTypes) { XmlQualifiedName qname = null; XmlSchemaComplexType complexType = null; XmlSchemaElement elem = at.parentElement; if (elem == null) { //case 1: "dummy" type for text content in a complex type, with restrictions complexType = at.wrappingType; qname = complexType.QualifiedName; } else { //case 2: anonymous type can also be nested under an element qname = elem.QualifiedName; complexType = elem.ElementSchemaType as XmlSchemaComplexType; } if (complexType != null) { if (complexType.GetContentType() == XmlSchemaContentType.TextOnly && complexType.IsDerivedByRestriction()) { //In this case, we take care of the content/text part only. No nesting types exist. ClrSimpleTypeInfo nestedTypeInfo = ClrSimpleTypeInfo .CreateSimpleTypeInfo( complexType); //Generate its "simple type" version to save restrictions nestedTypeInfo.clrtypeName = at.identifier; nestedTypeInfo.clrtypeNs = configSettings.GetClrNamespace(qname.Namespace); nestedTypeInfo.schemaName = qname.Name; nestedTypeInfo.schemaNs = qname.Namespace; nestedTypeInfo.typeOrigin = SchemaOrigin.Fragment; nestedTypeInfo.IsNested = true; BuildAnnotationInformation(nestedTypeInfo, complexType); typeInfo.NestedTypes.Add(nestedTypeInfo); } else { ClrContentTypeInfo nestedTypeInfo = new ClrContentTypeInfo() { Parent = typeInfo }; localSymbolTable.Init(at.identifier); nestedTypeInfo.clrtypeName = at.identifier; nestedTypeInfo.clrtypeNs = configSettings.GetClrNamespace(qname.Namespace); nestedTypeInfo.schemaName = qname.Name; nestedTypeInfo.schemaNs = qname.Namespace; nestedTypeInfo.typeOrigin = SchemaOrigin.Fragment; nestedTypeInfo.IsNested = true; nestedTypeInfo.baseType = BaseType(complexType); BuildProperties(elem, complexType, nestedTypeInfo); BuildNestedTypes(nestedTypeInfo); BuildAnnotationInformation(nestedTypeInfo, complexType); typeInfo.NestedTypes.Add(nestedTypeInfo); } } //Also handle simple types XmlSchemaSimpleType simpleType = null; if (elem != null) { simpleType = elem.ElementSchemaType as XmlSchemaSimpleType; } if (simpleType != null) { ClrSimpleTypeInfo nestedTypeInfo = ClrSimpleTypeInfo.CreateSimpleTypeInfo(simpleType); nestedTypeInfo.clrtypeName = at.identifier; nestedTypeInfo.clrtypeNs = configSettings.GetClrNamespace(qname.Namespace); nestedTypeInfo.schemaName = qname.Name; nestedTypeInfo.schemaNs = qname.Namespace; nestedTypeInfo.typeOrigin = SchemaOrigin.Fragment; nestedTypeInfo.IsNested = true; BuildAnnotationInformation(nestedTypeInfo, simpleType); typeInfo.NestedTypes.Add(nestedTypeInfo); } } }
private void BuildNestedTypes(ClrContentTypeInfo typeInfo) { ClrSimpleTypeInfo clrSimpleTypeInfo; foreach (AnonymousType at in this.localSymbolTable.GetAnonymousTypes()) { XmlQualifiedName qname = null; XmlSchemaComplexType complexType = null; XmlSchemaElement elem = at.parentElement; if (elem != null) { qname = elem.QualifiedName; complexType = elem.ElementSchemaType as XmlSchemaComplexType; } else { complexType = at.wrappingType; qname = complexType.QualifiedName; } if (complexType != null) { if ((complexType.GetContentType() != XmlSchemaContentType.TextOnly ? true : !complexType.IsDerivedByRestriction())) { ClrContentTypeInfo clrContentTypeInfo = new ClrContentTypeInfo(); this.localSymbolTable.Init(at.identifier); clrContentTypeInfo.clrtypeName = at.identifier; clrContentTypeInfo.clrtypeNs = this.configSettings.GetClrNamespace(qname.Namespace); clrContentTypeInfo.schemaName = qname.Name; clrContentTypeInfo.schemaNs = qname.Namespace; clrContentTypeInfo.typeOrigin = SchemaOrigin.Fragment; clrContentTypeInfo.IsNested = true; clrContentTypeInfo.baseType = this.BaseType(complexType); this.BuildProperties(elem, complexType, clrContentTypeInfo); this.BuildNestedTypes(clrContentTypeInfo); this.BuildAnnotationInformation(clrContentTypeInfo, complexType); typeInfo.NestedTypes.Add(clrContentTypeInfo); } else { clrSimpleTypeInfo = ClrSimpleTypeInfo.CreateSimpleTypeInfo(complexType); clrSimpleTypeInfo.clrtypeName = at.identifier; clrSimpleTypeInfo.clrtypeNs = this.configSettings.GetClrNamespace(qname.Namespace); clrSimpleTypeInfo.schemaName = qname.Name; clrSimpleTypeInfo.schemaNs = qname.Namespace; clrSimpleTypeInfo.typeOrigin = SchemaOrigin.Fragment; clrSimpleTypeInfo.IsNested = true; this.BuildAnnotationInformation(clrSimpleTypeInfo, complexType); typeInfo.NestedTypes.Add(clrSimpleTypeInfo); } } XmlSchemaSimpleType simpleType = null; if (elem != null) { simpleType = elem.ElementSchemaType as XmlSchemaSimpleType; } if (simpleType != null) { clrSimpleTypeInfo = ClrSimpleTypeInfo.CreateSimpleTypeInfo(simpleType); clrSimpleTypeInfo.clrtypeName = at.identifier; clrSimpleTypeInfo.clrtypeNs = this.configSettings.GetClrNamespace(qname.Namespace); clrSimpleTypeInfo.schemaName = qname.Name; clrSimpleTypeInfo.schemaNs = qname.Namespace; clrSimpleTypeInfo.typeOrigin = SchemaOrigin.Fragment; clrSimpleTypeInfo.IsNested = true; this.BuildAnnotationInformation(clrSimpleTypeInfo, simpleType); typeInfo.NestedTypes.Add(clrSimpleTypeInfo); } } }
private ClrPropertyInfo BuildComplexTypeTextProperty(XmlSchemaElement parentElement, XmlSchemaComplexType schemaType) { string identifier; ClrPropertyInfo clrPropertyInfo; Debug.Assert(schemaType != null); Debug.Assert(schemaType.GetContentType() == XmlSchemaContentType.TextOnly); ClrPropertyInfo textProperty = new ClrPropertyInfo("TypedValue", string.Empty, "TypedValue", Occurs.One) { Origin = SchemaOrigin.Text }; ClrTypeReference typeRef = null; bool anonymous = false; XmlSchemaType baseType = schemaType.BaseXmlSchemaType; if (!(baseType is XmlSchemaSimpleType)) { if (schemaType.HasFacetRestrictions()) { goto Label1; } clrPropertyInfo = null; return(clrPropertyInfo); } else { typeRef = this.BuildTypeReference(baseType, baseType.QualifiedName, false, true); anonymous = false; if (!this.textPropInheritanceTracker.ContainsKey(schemaType)) { this.textPropInheritanceTracker.Add(schemaType, textProperty); } } if (anonymous) { if (parentElement == null) { this.localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef); } else { identifier = this.localSymbolTable.AddLocalElement(parentElement); this.localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef); } } textProperty.TypeReference = typeRef; clrPropertyInfo = textProperty; return(clrPropertyInfo); Label1: XmlSchemaSimpleType st = schemaType.GetBaseSimpleType(); Debug.Assert(st != null); typeRef = this.BuildTypeReference(st, st.QualifiedName, true, true); typeRef.Validate = true; anonymous = true; ClrPropertyInfo baseProp = null; if (this.textPropInheritanceTracker.TryGetValue(baseType, out baseProp)) { textProperty.IsOverride = true; if (!baseProp.IsOverride) { baseProp.IsVirtual = true; } } if (anonymous) { if (parentElement == null) { this.localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef); } else { identifier = this.localSymbolTable.AddLocalElement(parentElement); this.localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef); } } textProperty.TypeReference = typeRef; clrPropertyInfo = textProperty; return(clrPropertyInfo); }