2 // System.Xml.Schema.XmlSchema.cs
5 // Dwivedi, Ajay kumar Adwiv@Yahoo.com
6 // Atsushi Enomoto ginga@kit.hi-ho.ne.jp
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Collections;
33 using System.Xml.Serialization;
34 using System.ComponentModel;
36 namespace System.Xml.Schema
39 /// Summary description for XmlSchema.
41 [XmlRoot ("schema",Namespace=XmlSchema.Namespace)]
42 public class XmlSchema : XmlSchemaObject
45 public const string Namespace = "http://www.w3.org/2001/XMLSchema";
46 public const string InstanceNamespace = "http://www.w3.org/2001/XMLSchema-instance";
47 internal const string XdtNamespace = "http://www.w3.org/2003/11/xpath-datatypes";
50 private XmlSchemaForm attributeFormDefault ;
51 private XmlSchemaObjectTable attributeGroups ;
52 private XmlSchemaObjectTable attributes ;
53 private XmlSchemaDerivationMethod blockDefault ;
54 private XmlSchemaForm elementFormDefault ;
55 private XmlSchemaObjectTable elements ;
56 private XmlSchemaDerivationMethod finalDefault ;
57 private XmlSchemaObjectTable groups ;
59 private XmlSchemaObjectCollection includes ;
60 private XmlSchemaObjectCollection items ;
61 private XmlSchemaObjectTable notations ;
62 private XmlSchemaObjectTable schemaTypes ;
63 private string targetNamespace ;
64 private XmlAttribute[] unhandledAttributes ;
65 private string version;
67 // other post schema compilation infoset
68 private Hashtable idCollection;
69 private XmlSchemaObjectTable namedIdentities;
70 private XmlSchemaSet schemas;
72 private XmlNameTable nameTable;
74 internal bool missedSubComponents;
76 // Only compilation-time use
77 private XmlSchemaObjectCollection compilationItems;
78 private Hashtable handledUris;
80 // Compiler specific things
81 const string xmlname = "schema";
85 attributeFormDefault= XmlSchemaForm.None;
86 blockDefault = XmlSchemaDerivationMethod.None;
87 elementFormDefault = XmlSchemaForm.None;
88 finalDefault = XmlSchemaDerivationMethod.None;
89 includes = new XmlSchemaObjectCollection();
91 items = new XmlSchemaObjectCollection();
92 attributeGroups = new XmlSchemaObjectTable();
93 attributes = new XmlSchemaObjectTable();
94 elements = new XmlSchemaObjectTable();
95 groups = new XmlSchemaObjectTable();
96 notations = new XmlSchemaObjectTable();
97 schemaTypes = new XmlSchemaObjectTable();
98 idCollection = new Hashtable ();
99 namedIdentities = new XmlSchemaObjectTable();
104 [DefaultValue (XmlSchemaForm.None)]
105 [System.Xml.Serialization.XmlAttribute ("attributeFormDefault")]
106 public XmlSchemaForm AttributeFormDefault
108 get{ return attributeFormDefault; }
109 set{ this.attributeFormDefault = value;}
112 [DefaultValue (XmlSchemaDerivationMethod.None)]
113 [System.Xml.Serialization.XmlAttribute ("blockDefault")]
114 public XmlSchemaDerivationMethod BlockDefault
116 get{ return blockDefault;}
117 set{ blockDefault = value;}
120 [DefaultValue (XmlSchemaDerivationMethod.None)]
121 [System.Xml.Serialization.XmlAttribute ("finalDefault")]
122 public XmlSchemaDerivationMethod FinalDefault
124 get{ return finalDefault; }
125 set{ finalDefault = value; }
128 [DefaultValue (XmlSchemaForm.None)]
129 [System.Xml.Serialization.XmlAttribute ("elementFormDefault")]
130 public XmlSchemaForm ElementFormDefault
132 get{ return elementFormDefault; }
133 set{ elementFormDefault = value; }
136 [System.Xml.Serialization.XmlAttribute ("targetNamespace", DataType="anyURI")]
137 public string TargetNamespace
139 get{ return targetNamespace; }
140 set{ targetNamespace = value; }
143 [System.Xml.Serialization.XmlAttribute ("version", DataType="token")]
144 public string Version
146 get{ return version; }
147 set{ version = value; }
150 [XmlElement ("include",typeof(XmlSchemaInclude))]
151 [XmlElement ("import",typeof(XmlSchemaImport))]
152 [XmlElement ("redefine",typeof(XmlSchemaRedefine))]
153 public XmlSchemaObjectCollection Includes
155 get{ return includes;}
158 [XmlElement ("simpleType", typeof (XmlSchemaSimpleType))]
159 [XmlElement ("complexType", typeof (XmlSchemaComplexType))]
160 [XmlElement ("group", typeof (XmlSchemaGroup))]
161 //Only Schema's attributeGroup has type XmlSchemaAttributeGroup.
162 //Others (complextype, restrictions etc) must have XmlSchemaAttributeGroupRef
163 [XmlElement ("attributeGroup", typeof (XmlSchemaAttributeGroup))]
164 [XmlElement ("element", typeof (XmlSchemaElement))]
165 [XmlElement ("attribute", typeof (XmlSchemaAttribute))]
166 [XmlElement ("notation", typeof (XmlSchemaNotation))]
167 [XmlElement ("annotation", typeof (XmlSchemaAnnotation))]
168 public XmlSchemaObjectCollection Items
174 public bool IsCompiled
176 get{ return this.CompilationId != Guid.Empty; }
180 public XmlSchemaObjectTable Attributes
182 get{ return attributes; }
186 public XmlSchemaObjectTable AttributeGroups
188 get{ return attributeGroups; }
192 public XmlSchemaObjectTable SchemaTypes
194 get{ return schemaTypes; }
198 public XmlSchemaObjectTable Elements
200 get{ return elements; }
203 [System.Xml.Serialization.XmlAttribute ("id", DataType="ID")]
211 public XmlAttribute [] UnhandledAttributes
214 if (unhandledAttributeList != null) {
215 unhandledAttributes = (XmlAttribute []) unhandledAttributeList.ToArray (typeof (XmlAttribute));
216 unhandledAttributeList = null;
218 return unhandledAttributes;
221 unhandledAttributes = value;
222 unhandledAttributeList = null;
227 public XmlSchemaObjectTable Groups
229 get{ return groups; }
233 public XmlSchemaObjectTable Notations
235 get{ return notations; }
238 internal Hashtable IDCollection
240 get { return idCollection; }
243 internal XmlSchemaObjectTable NamedIdentities
245 get { return namedIdentities; }
248 internal XmlSchemaSet Schemas
250 get { return schemas; }
258 /// This compile method does two things:
259 /// 1. It compiles and fills the PSVI dataset
260 /// 2. Validates the schema by calling Validate method.
261 /// Every XmlSchemaObject has a Compile Method which gets called.
264 /// 1. blockDefault must be one of #all | List of (extension | restriction | substitution)
265 /// 2. finalDefault must be one of (#all | List of (extension | restriction| union| list))
266 /// 3. id must be of type ID
267 /// 4. targetNamespace should be any uri
268 /// 5. version should be a normalizedString
271 [Obsolete ("Use XmlSchemaSet.Compile() instead.")]
273 public void Compile (ValidationEventHandler handler)
275 Compile (handler, new XmlUrlResolver ());
279 [Obsolete ("Use XmlSchemaSet.Compile() instead.")]
282 public void Compile (ValidationEventHandler handler, XmlResolver resolver)
284 internal void Compile (ValidationEventHandler handler, XmlResolver resolver)
287 Compile (handler, new Stack (), this, null, resolver);
290 internal void Compile (ValidationEventHandler handler, XmlSchemaSet col, XmlResolver resolver)
292 Compile (handler, new Stack (), this, col, resolver);
295 private void Compile (ValidationEventHandler handler, Stack schemaLocationStack, XmlSchema rootSchema, XmlSchemaSet col, XmlResolver resolver)
297 if (rootSchema != this) {
298 CompilationId = rootSchema.CompilationId;
299 schemas = rootSchema.schemas;
303 if (schemas == null) {
304 schemas = new XmlSchemaSet ();
305 schemas.CompilationId = Guid.NewGuid ();
307 CompilationId = schemas.CompilationId;
308 this.idCollection.Clear ();
310 if (!schemas.Contains (this)) // e.g. xs:import
313 attributeGroups.Clear ();
318 schemaTypes.Clear ();
319 namedIdentities.Clear ();
321 //1. Union and List are not allowed in block default
322 if (BlockDefault != XmlSchemaDerivationMethod.All) {
323 if((BlockDefault & XmlSchemaDerivationMethod.List)!=0 )
324 error(handler, "list is not allowed in blockDefault attribute");
325 if((BlockDefault & XmlSchemaDerivationMethod.Union)!=0 )
326 error(handler, "union is not allowed in blockDefault attribute");
329 //2. Substitution is not allowed in finaldefault.
330 if (FinalDefault != XmlSchemaDerivationMethod.All) {
331 if((FinalDefault & XmlSchemaDerivationMethod.Substitution)!=0 )
332 error(handler, "substitution is not allowed in finalDefault attribute");
335 //3. id must be of type ID
336 XmlSchemaUtil.CompileID(Id, this, this.IDCollection, handler);
338 //4. targetNamespace should be of type anyURI or absent
339 if (TargetNamespace != null) {
340 if (TargetNamespace.Length == 0)
341 error (handler, "The targetNamespace attribute cannot have have empty string as its value.");
343 if(!XmlSchemaUtil.CheckAnyUri (TargetNamespace))
344 error(handler, TargetNamespace+" is not a valid value for targetNamespace attribute of schema");
347 //5. version should be of type normalizedString
348 if (!XmlSchemaUtil.CheckNormalizedString(Version))
349 error(handler, Version + "is not a valid value for version attribute of schema");
351 // Compile the content of this schema
353 compilationItems = new XmlSchemaObjectCollection ();
354 for (int i = 0; i < Items.Count; i++) {
356 Items [i].Parent = this;
358 compilationItems.Add (Items [i]);
360 if (this == rootSchema)
361 handledUris = new Hashtable ();
363 // First, we run into inclusion schemas to collect
364 // compilation target items into compiledItems.
365 for (int i = 0; i < Includes.Count; i++) {
367 Includes [i].Parent = this;
369 XmlSchemaExternal ext = Includes [i] as XmlSchemaExternal;
371 error (handler, String.Format ("Object of Type {0} is not valid in Includes Property of XmlSchema", Includes [i].GetType().Name));
375 if (ext.SchemaLocation == null)
378 Stream stream = null;
380 if (resolver != null) {
381 url = GetResolvedUri (resolver, ext.SchemaLocation);
382 if (schemaLocationStack.Contains (url)) {
383 // Just skip nested inclusion.
384 // The spec is "carefully written"
385 // not to handle it as an error.
386 // error (handler, "Nested inclusion was found: " + url);
387 // must skip this inclusion
390 if (rootSchema.handledUris.Contains (url))
391 // This schema is already handled, so simply skip (otherwise, duplicate definition errrors occur.
393 rootSchema.handledUris.Add (url, url);
395 stream = resolver.GetEntity (new Uri (url), null, typeof (Stream)) as Stream;
396 } catch (Exception) {
397 // 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.
398 warn (handler, "Could not resolve schema location URI: " + url);
403 // Process redefinition children in advance.
404 XmlSchemaRedefine redefine = Includes [i] as XmlSchemaRedefine;
405 if (redefine != null) {
406 for (int j = 0; j < redefine.Items.Count; j++) {
407 XmlSchemaObject redefinedObj = redefine.Items [j];
408 redefinedObj.isRedefinedComponent = true;
409 redefinedObj.isRedefineChild = true;
410 if (redefinedObj is XmlSchemaType ||
411 redefinedObj is XmlSchemaGroup ||
412 redefinedObj is XmlSchemaAttributeGroup)
413 compilationItems.Add (redefinedObj);
415 error (handler, "Redefinition is only allowed to simpleType, complexType, group and attributeGroup.");
419 XmlSchema includedSchema = null;
420 if (stream == null) {
421 // It is missing schema components.
422 missedSubComponents = true;
425 schemaLocationStack.Push (url);
426 XmlTextReader xtr = null;
428 xtr = new XmlTextReader (url, stream, nameTable);
429 includedSchema = XmlSchema.Read (xtr, handler);
434 includedSchema.schemas = schemas;
437 // Set - actual - target namespace for the included schema * before compilation*.
438 XmlSchemaImport import = ext as XmlSchemaImport;
439 if (import != null) {
440 if (TargetNamespace == includedSchema.TargetNamespace) {
441 error (handler, "Target namespace must be different from that of included schema.");
443 } else if (includedSchema.TargetNamespace != import.Namespace) {
444 error (handler, "Attribute namespace and its importing schema's target namespace must be the same.");
448 if (TargetNamespace == null &&
449 includedSchema.TargetNamespace != null) {
450 error (handler, "Target namespace is required to include a schema which has its own target namespace");
453 else if (TargetNamespace != null &&
454 includedSchema.TargetNamespace == null)
455 includedSchema.TargetNamespace = TargetNamespace;
458 // Compile included schema.
459 includedSchema.idCollection = this.IDCollection;
460 includedSchema.Compile (handler, schemaLocationStack, rootSchema, col, resolver);
461 schemaLocationStack.Pop ();
464 rootSchema.schemas.Add (includedSchema);
466 // Note that we use compiled items. Items
467 // may not exist in Items, since included
468 // schema also includes another schemas.
469 foreach (DictionaryEntry entry in includedSchema.Attributes)
470 compilationItems.Add ((XmlSchemaObject) entry.Value);
471 foreach (DictionaryEntry entry in includedSchema.Elements)
472 compilationItems.Add ((XmlSchemaObject) entry.Value);
473 foreach (DictionaryEntry entry in includedSchema.SchemaTypes)
474 compilationItems.Add ((XmlSchemaObject) entry.Value);
475 foreach (DictionaryEntry entry in includedSchema.AttributeGroups)
476 compilationItems.Add ((XmlSchemaObject) entry.Value);
477 foreach (DictionaryEntry entry in includedSchema.Groups)
478 compilationItems.Add ((XmlSchemaObject) entry.Value);
479 foreach (DictionaryEntry entry in includedSchema.Notations)
480 compilationItems.Add ((XmlSchemaObject) entry.Value);
483 // Compilation phase.
484 // At least each Compile() must gives unique (qualified) name for each component.
485 // It also checks self-resolvable properties correct.
486 // Post compilation schema information contribution is not required here.
487 // It should be done by Validate().
488 for (int i = 0; i < compilationItems.Count; i++) {
489 XmlSchemaObject obj = compilationItems [i];
490 if(obj is XmlSchemaAnnotation) {
491 int numerr = ((XmlSchemaAnnotation)obj).Compile (handler, this);
492 errorCount += numerr;
493 } else if (obj is XmlSchemaAttribute) {
494 XmlSchemaAttribute attr = (XmlSchemaAttribute) obj;
495 attr.ParentIsSchema = true;
496 int numerr = attr.Compile (handler, this);
497 errorCount += numerr;
500 XmlSchemaUtil.AddToTable (Attributes, attr, attr.QualifiedName, handler);
502 } else if (obj is XmlSchemaAttributeGroup) {
503 XmlSchemaAttributeGroup attrgrp = (XmlSchemaAttributeGroup) obj;
504 int numerr = attrgrp.Compile(handler, this);
505 errorCount += numerr;
507 XmlSchemaUtil.AddToTable (
510 attrgrp.QualifiedName,
512 } else if (obj is XmlSchemaComplexType) {
513 XmlSchemaComplexType ctype = (XmlSchemaComplexType) obj;
514 ctype.ParentIsSchema = true;
515 int numerr = ctype.Compile (handler, this);
516 errorCount += numerr;
518 XmlSchemaUtil.AddToTable (
523 } else if (obj is XmlSchemaSimpleType) {
524 XmlSchemaSimpleType stype = (XmlSchemaSimpleType) obj;
525 stype.islocal = false; //This simple type is toplevel
526 int numerr = stype.Compile (handler, this);
527 errorCount += numerr;
529 XmlSchemaUtil.AddToTable (
534 } else if (obj is XmlSchemaElement) {
535 XmlSchemaElement elem = (XmlSchemaElement) obj;
536 elem.parentIsSchema = true;
537 int numerr = elem.Compile (handler, this);
538 errorCount += numerr;
540 XmlSchemaUtil.AddToTable (
545 } else if (obj is XmlSchemaGroup) {
546 XmlSchemaGroup grp = (XmlSchemaGroup) obj;
547 int numerr = grp.Compile (handler, this);
548 errorCount += numerr;
550 XmlSchemaUtil.AddToTable (
555 } else if (obj is XmlSchemaNotation) {
556 XmlSchemaNotation ntn = (XmlSchemaNotation) obj;
557 int numerr = ntn.Compile (handler, this);
558 errorCount += numerr;
560 XmlSchemaUtil.AddToTable (
566 ValidationHandler.RaiseValidationEvent (
569 String.Format ("Object of Type {0} is not valid in Item Property of Schema", obj.GetType ().Name),
573 XmlSeverityType.Error);
577 if (rootSchema == this)
585 private string GetResolvedUri (XmlResolver resolver, string relativeUri)
588 if (this.SourceUri != null && this.SourceUri != String.Empty)
589 baseUri = new Uri (this.SourceUri);
590 Uri abs = resolver.ResolveUri (baseUri, relativeUri);
591 return abs != null ? abs.ToString () : String.Empty;
594 internal bool IsNamespaceAbsent (string ns)
596 return !schemas.Contains (ns);
601 private void Validate (ValidationEventHandler handler)
603 ValidationId = CompilationId;
605 // Firstly Element needs to be filled their substitution group info
606 foreach (XmlSchemaElement elem in Elements.Values)
607 elem.FillSubstitutionElementInfo ();
610 foreach (XmlSchemaAttribute attr in Attributes.Values)
611 errorCount += attr.Validate (handler, this);
612 foreach (XmlSchemaAttributeGroup attrgrp in AttributeGroups.Values)
613 errorCount += attrgrp.Validate (handler, this);
614 foreach (XmlSchemaType type in SchemaTypes.Values)
615 errorCount += type.Validate (handler, this);
616 foreach (XmlSchemaElement elem in Elements.Values)
617 errorCount += elem.Validate (handler, this);
618 foreach (XmlSchemaGroup grp in Groups.Values)
619 errorCount += grp.Validate (handler, this);
620 foreach (XmlSchemaNotation ntn in Notations.Values)
621 errorCount += ntn.Validate (handler, this);
626 // We cannot use xml deserialization, since it does not provide line info, qname context, and so on.
627 public static XmlSchema Read (TextReader reader, ValidationEventHandler validationEventHandler)
629 return Read (new XmlTextReader (reader),validationEventHandler);
631 public static XmlSchema Read (Stream stream, ValidationEventHandler validationEventHandler)
633 return Read (new XmlTextReader (stream),validationEventHandler);
636 public static XmlSchema Read (XmlReader rdr, ValidationEventHandler validationEventHandler)
638 XmlSchemaReader reader = new XmlSchemaReader (rdr, validationEventHandler);
640 if (reader.ReadState == ReadState.Initial)
641 reader.ReadNextElement ();
643 int startDepth = reader.Depth;
647 switch(reader.NodeType)
649 case XmlNodeType.Element:
650 if(reader.LocalName == "schema")
652 XmlSchema schema = new XmlSchema ();
653 schema.nameTable = rdr.NameTable;
655 schema.LineNumber = reader.LineNumber;
656 schema.LinePosition = reader.LinePosition;
657 schema.SourceUri = reader.BaseURI;
659 ReadAttributes(schema, reader, validationEventHandler);
660 //IsEmptyElement does not behave properly if reader is
661 //positioned at an attribute.
662 reader.MoveToElement();
663 if(!reader.IsEmptyElement)
665 ReadContent(schema, reader, validationEventHandler);
673 //Schema can't be generated. Throw an exception
674 error (validationEventHandler, "The root element must be schema", null);
677 error(validationEventHandler, "This should never happen. XmlSchema.Read 1 ",null);
680 } while(reader.Depth > startDepth && reader.ReadNextElement());
682 // This is thrown regardless of ValidationEventHandler existence.
683 throw new XmlSchemaException ("The top level schema must have namespace " + XmlSchema.Namespace, null);
686 private static void ReadAttributes(XmlSchema schema, XmlSchemaReader reader, ValidationEventHandler h)
690 reader.MoveToElement();
691 while(reader.MoveToNextAttribute())
695 case "attributeFormDefault" :
696 schema.attributeFormDefault = XmlSchemaUtil.ReadFormAttribute(reader,out ex);
698 error(h, reader.Value + " is not a valid value for attributeFormDefault.", ex);
700 case "blockDefault" :
701 schema.blockDefault = XmlSchemaUtil.ReadDerivationAttribute(reader,out ex, "blockDefault",
702 XmlSchemaUtil.ElementBlockAllowed);
704 error (h, ex.Message, ex);
706 case "elementFormDefault":
707 schema.elementFormDefault = XmlSchemaUtil.ReadFormAttribute(reader, out ex);
709 error(h, reader.Value + " is not a valid value for elementFormDefault.", ex);
712 schema.finalDefault = XmlSchemaUtil.ReadDerivationAttribute(reader, out ex, "finalDefault",
713 XmlSchemaUtil.FinalAllowed);
715 error (h, ex.Message , ex);
718 schema.id = reader.Value;
720 case "targetNamespace":
721 schema.targetNamespace = reader.Value;
724 schema.version = reader.Value;
727 if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
728 error(h, reader.Name + " attribute is not allowed in schema element",null);
731 XmlSchemaUtil.ReadUnhandledAttribute(reader,schema);
738 private static void ReadContent(XmlSchema schema, XmlSchemaReader reader, ValidationEventHandler h)
740 reader.MoveToElement();
741 if(reader.LocalName != "schema" && reader.NamespaceURI != XmlSchema.Namespace && reader.NodeType != XmlNodeType.Element)
742 error(h, "UNREACHABLE CODE REACHED: Method: Schema.ReadContent, " + reader.LocalName + ", " + reader.NamespaceURI,null);
744 //(include | import | redefine | annotation)*,
745 //((simpleType | complexType | group | attributeGroup | element | attribute | notation | annotation)*
747 while(reader.ReadNextElement())
749 if(reader.NodeType == XmlNodeType.EndElement)
751 if(reader.LocalName != xmlname)
752 error(h,"Should not happen :2: XmlSchema.Read, name="+reader.Name,null);
757 if(reader.LocalName == "include")
759 XmlSchemaInclude include = XmlSchemaInclude.Read(reader,h);
761 schema.includes.Add(include);
764 if(reader.LocalName == "import")
766 XmlSchemaImport import = XmlSchemaImport.Read(reader,h);
768 schema.includes.Add(import);
771 if(reader.LocalName == "redefine")
773 XmlSchemaRedefine redefine = XmlSchemaRedefine.Read(reader,h);
775 schema.includes.Add(redefine);
778 if(reader.LocalName == "annotation")
780 XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
781 if(annotation != null)
782 schema.items.Add(annotation);
789 if(reader.LocalName == "simpleType")
791 XmlSchemaSimpleType stype = XmlSchemaSimpleType.Read(reader,h);
793 schema.items.Add(stype);
796 if(reader.LocalName == "complexType")
798 XmlSchemaComplexType ctype = XmlSchemaComplexType.Read(reader,h);
800 schema.items.Add(ctype);
803 if(reader.LocalName == "group")
805 XmlSchemaGroup group = XmlSchemaGroup.Read(reader,h);
807 schema.items.Add(group);
810 if(reader.LocalName == "attributeGroup")
812 XmlSchemaAttributeGroup attributeGroup = XmlSchemaAttributeGroup.Read(reader,h);
813 if(attributeGroup != null)
814 schema.items.Add(attributeGroup);
817 if(reader.LocalName == "element")
819 XmlSchemaElement element = XmlSchemaElement.Read(reader,h);
821 schema.items.Add(element);
824 if(reader.LocalName == "attribute")
826 XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h);
828 schema.items.Add(attr);
831 if(reader.LocalName == "notation")
833 XmlSchemaNotation notation = XmlSchemaNotation.Read(reader,h);
835 schema.items.Add(notation);
838 if(reader.LocalName == "annotation")
840 XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
841 if(annotation != null)
842 schema.items.Add(annotation);
846 reader.RaiseInvalidElementError();
853 public void Write(System.IO.Stream stream)
857 public void Write(System.IO.TextWriter writer)
861 public void Write(System.Xml.XmlWriter writer)
865 public void Write(System.IO.Stream stream, System.Xml.XmlNamespaceManager namespaceManager)
867 Write(new XmlTextWriter(stream,null),namespaceManager);
869 public void Write(System.IO.TextWriter writer, System.Xml.XmlNamespaceManager namespaceManager)
871 XmlTextWriter xwriter = new XmlTextWriter(writer);
872 xwriter.Formatting = Formatting.Indented;
873 Write(xwriter,namespaceManager);
876 public void Write (System.Xml.XmlWriter writer, System.Xml.XmlNamespaceManager namespaceManager)
878 XmlSerializerNamespaces nss = new XmlSerializerNamespaces ();
880 if (namespaceManager != null) {
881 foreach (string name in namespaceManager) {
882 //xml and xmlns namespaces are added by default in namespaceManager.
883 //So we should ignore them
884 if (name !="xml" && name != "xmlns")
885 nss.Add (name, namespaceManager.LookupNamespace (name));
889 if (Namespaces != null && Namespaces.Count > 0) {
890 XmlQualifiedName [] qnames = Namespaces.ToArray ();
891 foreach (XmlQualifiedName qn in qnames)
892 nss.Add (qn.Name, qn.Namespace);
893 string p = String.Empty;
895 for (int idx = 1; loop; idx++) {
897 foreach (XmlQualifiedName qn in qnames)
904 nss.Add (p, XmlSchema.Namespace);
907 if (nss.Count == 0) {
908 // Add the xml schema namespace. (It is done
909 // only when no entry exists in Namespaces).
910 nss.Add ("xs", XmlSchema.Namespace);
911 if (TargetNamespace != null && TargetNamespace.Length != 0)
912 nss.Add ("tns", TargetNamespace);
915 XmlSchemaSerializer xser = new XmlSchemaSerializer ();
916 XmlSerializerNamespaces backup = Namespaces;
919 xser.Serialize (writer, this, nss);
928 class XmlSchemaSerializer : XmlSerializer
930 protected override void Serialize (object o, XmlSerializationWriter writer)
932 XmlSchemaSerializationWriter w = writer as XmlSchemaSerializationWriter;
933 w.WriteRoot_XmlSchema ((XmlSchema) o);
936 protected override XmlSerializationWriter CreateWriter ()
938 return new XmlSchemaSerializationWriter ();