void ProcessExternal(ValidationEventHandler handler, List <CompiledSchemaMemo> handledUris, XmlResolver resolver, XmlSchemaExternal ext, XmlSchemaSet col) { if (ext == null) { error(handler, "Object is not valid in Includes Property of XmlSchema"); return; } // The only case we want to handle where the SchemaLocation is null is if the external is an import. XmlSchemaImport import = ext as XmlSchemaImport; if (ext.SchemaLocation == null && import == null) { return; } XmlSchema includedSchema = null; if (ext.SchemaLocation != null) { Stream stream = null; string url = null; if (resolver != null) { url = GetResolvedUri(resolver, ext.SchemaLocation); foreach (var i in handledUris) { if (i.SourceUri.Equals(url)) { // This schema is already handled, so simply skip (otherwise, duplicate definition errrors occur. return; } } handledUris.Add(new CompiledSchemaMemo() { SourceUri = url }); try { stream = resolver.GetEntity(new Uri(url), null, typeof(Stream)) as Stream; } catch (Exception) { // LAMESPEC: This is not good way to handle errors, but since we cannot know what kind of XmlResolver will come, so there are no mean to avoid this ugly catch. warn(handler, "Could not resolve schema location URI: " + url); stream = null; } } // Process redefinition children in advance. XmlSchemaRedefine redefine = ext as XmlSchemaRedefine; if (redefine != null) { for (int j = 0; j < redefine.Items.Count; j++) { XmlSchemaObject redefinedObj = redefine.Items [j]; redefinedObj.isRedefinedComponent = true; redefinedObj.isRedefineChild = true; if (redefinedObj is XmlSchemaType || redefinedObj is XmlSchemaGroup || redefinedObj is XmlSchemaAttributeGroup) { compilationItems.Add(redefinedObj); } else { error(handler, "Redefinition is only allowed to simpleType, complexType, group and attributeGroup."); } } } if (stream == null) { // It is missing schema components. missedSubComponents = true; return; } else { XmlTextReader xtr = null; try { xtr = new XmlTextReader(url, stream, nameTable); includedSchema = XmlSchema.Read(xtr, handler); } finally { if (xtr != null) { xtr.Close(); } } includedSchema.schemas = schemas; } includedSchema.SetParent(); ext.Schema = includedSchema; } // Set - actual - target namespace for the included schema * before compilation*. if (import != null) { if (ext.Schema == null && ext.SchemaLocation == null) { // if a schema location wasn't specified, check the other schemas we have to see if one of those // is a match. foreach (XmlSchema schema in col.Schemas()) { if (schema.TargetNamespace == import.Namespace) { includedSchema = schema; includedSchema.schemas = schemas; includedSchema.SetParent(); ext.Schema = includedSchema; break; } } // handle case where target namespace doesn't exist in schema collection - i.e can't find it at all if (includedSchema == null) { return; } } else if (includedSchema != null) { if (TargetNamespace == includedSchema.TargetNamespace) { error(handler, "Target namespace must be different from that of included schema."); return; } else if (includedSchema.TargetNamespace != import.Namespace) { error(handler, "Attribute namespace and its importing schema's target namespace must be the same."); return; } } } else if (includedSchema != null) { if (TargetNamespace == null && includedSchema.TargetNamespace != null) { includedSchema.error(handler, String.Format("On {0} element, targetNamespace is required to include a schema which has its own target namespace", ext.GetType().Name)); return; } else if (TargetNamespace != null && includedSchema.TargetNamespace == null) { includedSchema.TargetNamespace = TargetNamespace; } } // Do not compile included schema here. if (includedSchema != null) { AddExternalComponentsTo(includedSchema, compilationItems, handler, handledUris, resolver, col); } }
void DoCompile(ValidationEventHandler handler, List <CompiledSchemaMemo> handledUris, XmlSchemaSet col, XmlResolver resolver) { SetParent(); CompilationId = col.CompilationId; schemas = col; if (!schemas.Contains(this)) // e.g. xs:import { schemas.Add(this); } attributeGroups.Clear(); attributes.Clear(); elements.Clear(); groups.Clear(); notations.Clear(); schemaTypes.Clear(); named_identities.Clear(); ids.Clear(); compilationItems.Clear(); //1. Union and List are not allowed in block default if (BlockDefault != XmlSchemaDerivationMethod.All) { if ((BlockDefault & XmlSchemaDerivationMethod.List) != 0) { error(handler, "list is not allowed in blockDefault attribute"); } if ((BlockDefault & XmlSchemaDerivationMethod.Union) != 0) { error(handler, "union is not allowed in blockDefault attribute"); } } //2. Substitution is not allowed in finaldefault. if (FinalDefault != XmlSchemaDerivationMethod.All) { if ((FinalDefault & XmlSchemaDerivationMethod.Substitution) != 0) { error(handler, "substitution is not allowed in finalDefault attribute"); } } //3. id must be of type ID XmlSchemaUtil.CompileID(Id, this, IDCollection, handler); //4. targetNamespace should be of type anyURI or absent if (TargetNamespace != null) { if (TargetNamespace.Length == 0) { error(handler, "The targetNamespace attribute cannot have have empty string as its value."); } if (!XmlSchemaUtil.CheckAnyUri(TargetNamespace)) { error(handler, TargetNamespace + " is not a valid value for targetNamespace attribute of schema"); } } //5. version should be of type normalizedString if (!XmlSchemaUtil.CheckNormalizedString(Version)) { error(handler, Version + "is not a valid value for version attribute of schema"); } // Compile the content of this schema for (int i = 0; i < Items.Count; i++) { compilationItems.Add(Items [i]); } // First, we run into inclusion schemas to collect // compilation target items into compiledItems. for (int i = 0; i < Includes.Count; i++) { ProcessExternal(handler, handledUris, resolver, Includes [i] as XmlSchemaExternal, col); } // Compilation phase. // At least each Compile() must give unique (qualified) name for each component. // It also checks self-resolvable properties correctness. // Post compilation schema information contribution is not done here. // It should be done by Validate(). for (int i = 0; i < compilationItems.Count; i++) { XmlSchemaObject obj = compilationItems [i]; if (obj is XmlSchemaAnnotation) { int numerr = ((XmlSchemaAnnotation)obj).Compile(handler, this); errorCount += numerr; } else if (obj is XmlSchemaAttribute) { XmlSchemaAttribute attr = (XmlSchemaAttribute)obj; int numerr = attr.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable(Attributes, attr, attr.QualifiedName, handler); } } else if (obj is XmlSchemaAttributeGroup) { XmlSchemaAttributeGroup attrgrp = (XmlSchemaAttributeGroup)obj; int numerr = attrgrp.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable( AttributeGroups, attrgrp, attrgrp.QualifiedName, handler); } } else if (obj is XmlSchemaComplexType) { XmlSchemaComplexType ctype = (XmlSchemaComplexType)obj; int numerr = ctype.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable( schemaTypes, ctype, ctype.QualifiedName, handler); } } else if (obj is XmlSchemaSimpleType) { XmlSchemaSimpleType stype = (XmlSchemaSimpleType)obj; stype.islocal = false; //This simple type is toplevel int numerr = stype.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable( SchemaTypes, stype, stype.QualifiedName, handler); } } else if (obj is XmlSchemaElement) { XmlSchemaElement elem = (XmlSchemaElement)obj; elem.parentIsSchema = true; int numerr = elem.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable( Elements, elem, elem.QualifiedName, handler); } } else if (obj is XmlSchemaGroup) { XmlSchemaGroup grp = (XmlSchemaGroup)obj; int numerr = grp.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable( Groups, grp, grp.QualifiedName, handler); } } else if (obj is XmlSchemaNotation) { XmlSchemaNotation ntn = (XmlSchemaNotation)obj; int numerr = ntn.Compile(handler, this); errorCount += numerr; if (numerr == 0) { XmlSchemaUtil.AddToTable( Notations, ntn, ntn.QualifiedName, handler); } } else { ValidationHandler.RaiseValidationEvent( handler, null, String.Format("Object of Type {0} is not valid in Item Property of Schema", obj.GetType().Name), null, this, null, XmlSeverityType.Error); } } }
private static string GetMessage(string message, string sourceUri, object sender, XmlSchemaObject sourceObj) { IXmlLineInfo li = sender as IXmlLineInfo; if (li == null) { return(GetMessage(message, sourceUri, 0, 0, sourceObj)); } else { return(GetMessage(message, sourceUri, li.LineNumber, li.LinePosition, sourceObj)); } }
private static string GetMessage(string message, string sourceUri, int lineNumber, int linePosition, XmlSchemaObject sourceObj) { string msg = "XmlSchema error: " + message; if (lineNumber > 0) { msg += String.Format(CultureInfo.InvariantCulture, " XML {0} Line {1}, Position {2}.", (sourceUri != null && sourceUri != "") ? "URI: " + sourceUri + " ." : "", lineNumber, linePosition); } #if !MOBILE if (sourceObj != null) { msg += String.Format(CultureInfo.InvariantCulture, " Related schema item SourceUri: {0}, Line {1}, Position {2}.", sourceObj.SourceUri, sourceObj.LineNumber, sourceObj.LinePosition); } #endif return(msg); }
internal void Set(XmlQualifiedName name, XmlSchemaObject value) { table [name] = value; }