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")]
137 public string TargetNamespace
139 get{ return targetNamespace; }
140 set{ targetNamespace = value; }
143 [System.Xml.Serialization.XmlAttribute ("version")]
144 public string Version
146 get{ return version; }
147 set{ version = value; }
150 [XmlElement ("include",typeof(XmlSchemaInclude), Namespace="http://www.w3.org/2001/XMLSchema")]
151 [XmlElement ("import",typeof(XmlSchemaImport), Namespace="http://www.w3.org/2001/XMLSchema")]
152 [XmlElement ("redefine",typeof(XmlSchemaRedefine), Namespace="http://www.w3.org/2001/XMLSchema")]
153 public XmlSchemaObjectCollection Includes
155 get{ return includes;}
158 [XmlElement ("simpleType", typeof (XmlSchemaSimpleType), Namespace="http://www.w3.org/2001/XMLSchema")]
159 [XmlElement ("complexType", typeof (XmlSchemaComplexType), Namespace="http://www.w3.org/2001/XMLSchema")]
160 [XmlElement ("group", typeof (XmlSchemaGroup),Namespace="http://www.w3.org/2001/XMLSchema")]
161 //Only Schema's attributeGroup has type XmlSchemaAttributeGroup.
162 //Others (complextype, restrictions etc) must have XmlSchemaAttributeGroupRef
163 [XmlElement ("attributeGroup", typeof (XmlSchemaAttributeGroup), Namespace="http://www.w3.org/2001/XMLSchema")]
164 [XmlElement ("element", typeof (XmlSchemaElement), Namespace="http://www.w3.org/2001/XMLSchema")]
165 [XmlElement ("attribute", typeof (XmlSchemaAttribute), Namespace="http://www.w3.org/2001/XMLSchema")]
166 [XmlElement ("notation", typeof (XmlSchemaNotation), Namespace="http://www.w3.org/2001/XMLSchema")]
167 [XmlElement ("annotation", typeof (XmlSchemaAnnotation), Namespace="http://www.w3.org/2001/XMLSchema")]
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")]
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
270 public void Compile (ValidationEventHandler handler)
272 Compile (handler, new XmlUrlResolver ());
276 public void Compile (ValidationEventHandler handler, XmlResolver resolver)
278 internal void Compile (ValidationEventHandler handler, XmlResolver resolver)
281 Compile (handler, new Stack (), this, null, resolver);
284 internal void Compile (ValidationEventHandler handler, XmlSchemaSet col, XmlResolver resolver)
286 Compile (handler, new Stack (), this, col, resolver);
289 private void Compile (ValidationEventHandler handler, Stack schemaLocationStack, XmlSchema rootSchema, XmlSchemaSet col, XmlResolver resolver)
291 if (rootSchema != this) {
292 CompilationId = rootSchema.CompilationId;
293 schemas = rootSchema.schemas;
297 if (schemas == null) {
298 schemas = new XmlSchemaSet ();
299 schemas.CompilationId = Guid.NewGuid ();
301 CompilationId = schemas.CompilationId;
302 this.idCollection.Clear ();
304 if (!schemas.Contains (this)) // e.g. xs:import
307 attributeGroups.Clear ();
312 schemaTypes.Clear ();
313 namedIdentities.Clear ();
315 //1. Union and List are not allowed in block default
316 if (BlockDefault != XmlSchemaDerivationMethod.All) {
317 if((BlockDefault & XmlSchemaDerivationMethod.List)!=0 )
318 error(handler, "list is not allowed in blockDefault attribute");
319 if((BlockDefault & XmlSchemaDerivationMethod.Union)!=0 )
320 error(handler, "union is not allowed in blockDefault attribute");
323 //2. Substitution is not allowed in finaldefault.
324 if (FinalDefault != XmlSchemaDerivationMethod.All) {
325 if((FinalDefault & XmlSchemaDerivationMethod.Substitution)!=0 )
326 error(handler, "substitution is not allowed in finalDefault attribute");
329 //3. id must be of type ID
330 XmlSchemaUtil.CompileID(Id, this, this.IDCollection, handler);
332 //4. targetNamespace should be of type anyURI or absent
333 if (TargetNamespace != null) {
334 if(!XmlSchemaUtil.CheckAnyUri (TargetNamespace))
335 error(handler, TargetNamespace+" is not a valid value for targetNamespace attribute of schema");
338 //5. version should be of type normalizedString
339 if (!XmlSchemaUtil.CheckNormalizedString(Version))
340 error(handler, Version + "is not a valid value for version attribute of schema");
342 // Compile the content of this schema
344 compilationItems = new XmlSchemaObjectCollection ();
345 for (int i = 0; i < Items.Count; i++)
346 compilationItems.Add (Items [i]);
347 if (this == rootSchema)
348 handledUris = new Hashtable ();
350 // First, we run into inclusion schemas to collect
351 // compilation target items into compiledItems.
352 for (int i = 0; i < Includes.Count; i++) {
353 XmlSchemaExternal ext = Includes [i] as XmlSchemaExternal;
355 error (handler, String.Format ("Object of Type {0} is not valid in Includes Property of XmlSchema", Includes [i].GetType().Name));
359 if (ext.SchemaLocation == null)
362 Stream stream = null;
364 if (resolver != null) {
365 url = GetResolvedUri (resolver, ext.SchemaLocation);
366 if (schemaLocationStack.Contains (url)) {
367 // Just skip nested inclusion.
368 // The spec is "carefully written"
369 // not to handle it as an error.
370 // error (handler, "Nested inclusion was found: " + url);
371 // must skip this inclusion
374 if (rootSchema.handledUris.Contains (url))
375 // This schema is already handled, so simply skip (otherwise, duplicate definition errrors occur.
377 rootSchema.handledUris.Add (url, url);
379 stream = resolver.GetEntity (new Uri (url), null, typeof (Stream)) as Stream;
380 } catch (Exception) {
381 // 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.
382 warn (handler, "Could not resolve schema location URI: " + url);
387 // Process redefinition children in advance.
388 XmlSchemaRedefine redefine = Includes [i] as XmlSchemaRedefine;
389 if (redefine != null) {
390 for (int j = 0; j < redefine.Items.Count; j++) {
391 XmlSchemaObject redefinedObj = redefine.Items [j];
392 redefinedObj.isRedefinedComponent = true;
393 redefinedObj.isRedefineChild = true;
394 if (redefinedObj is XmlSchemaType ||
395 redefinedObj is XmlSchemaGroup ||
396 redefinedObj is XmlSchemaAttributeGroup)
397 compilationItems.Add (redefinedObj);
399 error (handler, "Redefinition is only allowed to simpleType, complexType, group and attributeGroup.");
403 XmlSchema includedSchema = null;
404 if (stream == null) {
405 // It is missing schema components.
406 missedSubComponents = true;
409 schemaLocationStack.Push (url);
410 XmlTextReader xtr = null;
412 xtr = new XmlTextReader (url, stream, nameTable);
413 includedSchema = XmlSchema.Read (xtr, handler);
418 includedSchema.schemas = schemas;
421 // Set - actual - target namespace for the included schema * before compilation*.
422 XmlSchemaImport import = ext as XmlSchemaImport;
423 if (import != null) {
424 if (TargetNamespace == includedSchema.TargetNamespace) {
425 error (handler, "Target namespace must be different from that of included schema.");
427 } else if (includedSchema.TargetNamespace != import.Namespace) {
428 error (handler, "Attribute namespace and its importing schema's target namespace must be the same.");
432 if (TargetNamespace == null &&
433 includedSchema.TargetNamespace != null) {
434 error (handler, "Target namespace is required to include a schema which has its own target namespace");
437 else if (TargetNamespace != null &&
438 includedSchema.TargetNamespace == null)
439 includedSchema.TargetNamespace = TargetNamespace;
442 // Compile included schema.
443 includedSchema.idCollection = this.IDCollection;
444 includedSchema.Compile (handler, schemaLocationStack, rootSchema, col, resolver);
445 schemaLocationStack.Pop ();
448 rootSchema.schemas.Add (includedSchema);
450 // Note that we use compiled items. Items
451 // may not exist in Items, since included
452 // schema also includes another schemas.
453 foreach (DictionaryEntry entry in includedSchema.Attributes)
454 compilationItems.Add ((XmlSchemaObject) entry.Value);
455 foreach (DictionaryEntry entry in includedSchema.Elements)
456 compilationItems.Add ((XmlSchemaObject) entry.Value);
457 foreach (DictionaryEntry entry in includedSchema.SchemaTypes)
458 compilationItems.Add ((XmlSchemaObject) entry.Value);
459 foreach (DictionaryEntry entry in includedSchema.AttributeGroups)
460 compilationItems.Add ((XmlSchemaObject) entry.Value);
461 foreach (DictionaryEntry entry in includedSchema.Groups)
462 compilationItems.Add ((XmlSchemaObject) entry.Value);
463 foreach (DictionaryEntry entry in includedSchema.Notations)
464 compilationItems.Add ((XmlSchemaObject) entry.Value);
467 // Compilation phase.
468 // At least each Compile() must gives unique (qualified) name for each component.
469 // It also checks self-resolvable properties correct.
470 // Post compilation schema information contribution is not required here.
471 // It should be done by Validate().
472 for (int i = 0; i < compilationItems.Count; i++) {
473 XmlSchemaObject obj = compilationItems [i];
474 if(obj is XmlSchemaAnnotation) {
475 int numerr = ((XmlSchemaAnnotation)obj).Compile (handler, this);
476 errorCount += numerr;
477 } else if (obj is XmlSchemaAttribute) {
478 XmlSchemaAttribute attr = (XmlSchemaAttribute) obj;
479 attr.ParentIsSchema = true;
480 int numerr = attr.Compile (handler, this);
481 errorCount += numerr;
484 XmlSchemaUtil.AddToTable (Attributes, attr, attr.QualifiedName, handler);
486 } else if (obj is XmlSchemaAttributeGroup) {
487 XmlSchemaAttributeGroup attrgrp = (XmlSchemaAttributeGroup) obj;
488 int numerr = attrgrp.Compile(handler, this);
489 errorCount += numerr;
491 XmlSchemaUtil.AddToTable (
494 attrgrp.QualifiedName,
496 } else if (obj is XmlSchemaComplexType) {
497 XmlSchemaComplexType ctype = (XmlSchemaComplexType) obj;
498 ctype.ParentIsSchema = true;
499 int numerr = ctype.Compile (handler, this);
500 errorCount += numerr;
502 XmlSchemaUtil.AddToTable (
507 } else if (obj is XmlSchemaSimpleType) {
508 XmlSchemaSimpleType stype = (XmlSchemaSimpleType) obj;
509 stype.islocal = false; //This simple type is toplevel
510 int numerr = stype.Compile (handler, this);
511 errorCount += numerr;
513 XmlSchemaUtil.AddToTable (
518 } else if (obj is XmlSchemaElement) {
519 XmlSchemaElement elem = (XmlSchemaElement) obj;
520 elem.parentIsSchema = true;
521 int numerr = elem.Compile (handler, this);
522 errorCount += numerr;
524 XmlSchemaUtil.AddToTable (
529 } else if (obj is XmlSchemaGroup) {
530 XmlSchemaGroup grp = (XmlSchemaGroup) obj;
531 int numerr = grp.Compile (handler, this);
532 errorCount += numerr;
534 XmlSchemaUtil.AddToTable (
539 } else if (obj is XmlSchemaNotation) {
540 XmlSchemaNotation ntn = (XmlSchemaNotation) obj;
541 int numerr = ntn.Compile (handler, this);
542 errorCount += numerr;
544 XmlSchemaUtil.AddToTable (
550 ValidationHandler.RaiseValidationEvent (
553 String.Format ("Object of Type {0} is not valid in Item Property of Schema", obj.GetType ().Name),
557 XmlSeverityType.Error);
561 if (rootSchema == this)
569 private string GetResolvedUri (XmlResolver resolver, string relativeUri)
572 if (this.SourceUri != null && this.SourceUri != String.Empty)
573 baseUri = new Uri (this.SourceUri);
574 return resolver.ResolveUri (baseUri, relativeUri).ToString ();
577 internal bool IsNamespaceAbsent (string ns)
579 return !schemas.Contains (ns);
584 private void Validate (ValidationEventHandler handler)
586 ValidationId = CompilationId;
588 // Firstly Element needs to be filled their substitution group info
589 foreach (XmlSchemaElement elem in Elements.Values)
590 elem.FillSubstitutionElementInfo ();
593 foreach (XmlSchemaAttribute attr in Attributes.Values)
594 errorCount += attr.Validate (handler, this);
595 foreach (XmlSchemaAttributeGroup attrgrp in AttributeGroups.Values)
596 errorCount += attrgrp.Validate (handler, this);
597 foreach (XmlSchemaType type in SchemaTypes.Values)
598 errorCount += type.Validate (handler, this);
599 foreach (XmlSchemaElement elem in Elements.Values)
600 errorCount += elem.Validate (handler, this);
601 foreach (XmlSchemaGroup grp in Groups.Values)
602 errorCount += grp.Validate (handler, this);
603 foreach (XmlSchemaNotation ntn in Notations.Values)
604 errorCount += ntn.Validate (handler, this);
609 // We cannot use xml deserialization, since it does not provide line info, qname context, and so on.
610 public static XmlSchema Read (TextReader reader, ValidationEventHandler validationEventHandler)
612 return Read (new XmlTextReader (reader),validationEventHandler);
614 public static XmlSchema Read (Stream stream, ValidationEventHandler validationEventHandler)
616 return Read (new XmlTextReader (stream),validationEventHandler);
619 public static XmlSchema Read (XmlReader rdr, ValidationEventHandler validationEventHandler)
621 XmlSchemaReader reader = new XmlSchemaReader (rdr, validationEventHandler);
623 if (reader.ReadState == ReadState.Initial)
624 reader.ReadNextElement ();
626 int startDepth = reader.Depth;
630 switch(reader.NodeType)
632 case XmlNodeType.Element:
633 if(reader.LocalName == "schema")
635 XmlSchema schema = new XmlSchema ();
636 schema.nameTable = rdr.NameTable;
638 schema.LineNumber = reader.LineNumber;
639 schema.LinePosition = reader.LinePosition;
640 schema.SourceUri = reader.BaseURI;
642 ReadAttributes(schema, reader, validationEventHandler);
643 //IsEmptyElement does not behave properly if reader is
644 //positioned at an attribute.
645 reader.MoveToElement();
646 if(!reader.IsEmptyElement)
648 ReadContent(schema, reader, validationEventHandler);
653 if (rdr.NodeType == XmlNodeType.EndElement)
658 //Schema can't be generated. Throw an exception
659 error (validationEventHandler, "The root element must be schema", null);
662 error(validationEventHandler, "This should never happen. XmlSchema.Read 1 ",null);
665 } while(reader.Depth > startDepth && reader.ReadNextElement());
667 // This is thrown regardless of ValidationEventHandler existence.
668 throw new XmlSchemaException ("The top level schema must have namespace " + XmlSchema.Namespace, null);
671 private static void ReadAttributes(XmlSchema schema, XmlSchemaReader reader, ValidationEventHandler h)
675 reader.MoveToElement();
676 while(reader.MoveToNextAttribute())
680 case "attributeFormDefault" :
681 schema.attributeFormDefault = XmlSchemaUtil.ReadFormAttribute(reader,out ex);
683 error(h, reader.Value + " is not a valid value for attributeFormDefault.", ex);
685 case "blockDefault" :
686 schema.blockDefault = XmlSchemaUtil.ReadDerivationAttribute(reader,out ex, "blockDefault",
687 XmlSchemaUtil.ElementBlockAllowed);
689 error (h, ex.Message, ex);
691 case "elementFormDefault":
692 schema.elementFormDefault = XmlSchemaUtil.ReadFormAttribute(reader, out ex);
694 error(h, reader.Value + " is not a valid value for elementFormDefault.", ex);
697 schema.finalDefault = XmlSchemaUtil.ReadDerivationAttribute(reader, out ex, "finalDefault",
698 XmlSchemaUtil.FinalAllowed);
700 error (h, ex.Message , ex);
703 schema.id = reader.Value;
705 case "targetNamespace":
706 schema.targetNamespace = reader.Value;
709 schema.version = reader.Value;
712 if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
713 error(h, reader.Name + " attribute is not allowed in schema element",null);
716 XmlSchemaUtil.ReadUnhandledAttribute(reader,schema);
723 private static void ReadContent(XmlSchema schema, XmlSchemaReader reader, ValidationEventHandler h)
725 reader.MoveToElement();
726 if(reader.LocalName != "schema" && reader.NamespaceURI != XmlSchema.Namespace && reader.NodeType != XmlNodeType.Element)
727 error(h, "UNREACHABLE CODE REACHED: Method: Schema.ReadContent, " + reader.LocalName + ", " + reader.NamespaceURI,null);
729 //(include | import | redefine | annotation)*,
730 //((simpleType | complexType | group | attributeGroup | element | attribute | notation | annotation)*
732 while(reader.ReadNextElement())
734 if(reader.NodeType == XmlNodeType.EndElement)
736 if(reader.LocalName != xmlname)
737 error(h,"Should not happen :2: XmlSchema.Read, name="+reader.Name,null);
742 if(reader.LocalName == "include")
744 XmlSchemaInclude include = XmlSchemaInclude.Read(reader,h);
746 schema.includes.Add(include);
749 if(reader.LocalName == "import")
751 XmlSchemaImport import = XmlSchemaImport.Read(reader,h);
753 schema.includes.Add(import);
756 if(reader.LocalName == "redefine")
758 XmlSchemaRedefine redefine = XmlSchemaRedefine.Read(reader,h);
760 schema.includes.Add(redefine);
763 if(reader.LocalName == "annotation")
765 XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
766 if(annotation != null)
767 schema.items.Add(annotation);
774 if(reader.LocalName == "simpleType")
776 XmlSchemaSimpleType stype = XmlSchemaSimpleType.Read(reader,h);
778 schema.items.Add(stype);
781 if(reader.LocalName == "complexType")
783 XmlSchemaComplexType ctype = XmlSchemaComplexType.Read(reader,h);
785 schema.items.Add(ctype);
788 if(reader.LocalName == "group")
790 XmlSchemaGroup group = XmlSchemaGroup.Read(reader,h);
792 schema.items.Add(group);
795 if(reader.LocalName == "attributeGroup")
797 XmlSchemaAttributeGroup attributeGroup = XmlSchemaAttributeGroup.Read(reader,h);
798 if(attributeGroup != null)
799 schema.items.Add(attributeGroup);
802 if(reader.LocalName == "element")
804 XmlSchemaElement element = XmlSchemaElement.Read(reader,h);
806 schema.items.Add(element);
809 if(reader.LocalName == "attribute")
811 XmlSchemaAttribute attr = XmlSchemaAttribute.Read(reader,h);
813 schema.items.Add(attr);
816 if(reader.LocalName == "notation")
818 XmlSchemaNotation notation = XmlSchemaNotation.Read(reader,h);
820 schema.items.Add(notation);
823 if(reader.LocalName == "annotation")
825 XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
826 if(annotation != null)
827 schema.items.Add(annotation);
831 reader.RaiseInvalidElementError();
838 public void Write(System.IO.Stream stream)
842 public void Write(System.IO.TextWriter writer)
846 public void Write(System.Xml.XmlWriter writer)
850 public void Write(System.IO.Stream stream, System.Xml.XmlNamespaceManager namespaceManager)
852 Write(new XmlTextWriter(stream,null),namespaceManager);
854 public void Write(System.IO.TextWriter writer, System.Xml.XmlNamespaceManager namespaceManager)
856 XmlTextWriter xwriter = new XmlTextWriter(writer);
857 xwriter.Formatting = Formatting.Indented;
858 Write(xwriter,namespaceManager);
861 public void Write (System.Xml.XmlWriter writer, System.Xml.XmlNamespaceManager namespaceManager)
863 XmlSerializerNamespaces nss = new XmlSerializerNamespaces ();
865 if (namespaceManager != null) {
867 nss = new XmlSerializerNamespaces ();
868 foreach (string name in namespaceManager) {
869 //xml and xmlns namespaces are added by default in namespaceManager.
870 //So we should ignore them
871 if (name !="xml" && name != "xmlns")
872 nss.Add (name, namespaceManager.LookupNamespace (name));
876 if (Namespaces != null && Namespaces.Count > 0) {
877 nss.Add (String.Empty, XmlSchema.Namespace);
878 foreach (XmlQualifiedName qn in Namespaces.ToArray ()) {
879 nss.Add (qn.Name, qn.Namespace);
883 if (nss.Count == 0) {
884 // Add the xml schema namespace. (It is done
885 // only when no entry exists in Namespaces).
886 nss.Add ("xs", XmlSchema.Namespace);
887 if (TargetNamespace != null)
888 nss.Add ("tns", TargetNamespace);
891 XmlSchemaSerializer xser = new XmlSchemaSerializer ();
892 xser.Serialize (writer, this, nss);
898 class XmlSchemaSerializer : XmlSerializer
900 protected override void Serialize (object o, XmlSerializationWriter writer)
902 XmlSchemaSerializationWriter w = writer as XmlSchemaSerializationWriter;
903 w.WriteRoot_XmlSchema ((XmlSchema) o);
906 protected override XmlSerializationWriter CreateWriter ()
908 return new XmlSchemaSerializationWriter ();