// Author: Dwivedi, Ajay kumar
// Adwiv@Yahoo.com
using System;
using System.Xml;
using System.IO;
using System.Xml.Serialization;
using System.ComponentModel;
namespace System.Xml.Schema
{
///
/// Summary description for XmlSchema.
///
[XmlRoot("schema",Namespace="http://www.w3.org/2001/XMLSchema")]
public class XmlSchema : XmlSchemaObject
{
//public constants
[XmlIgnore]
public const string InstanceNamespace = "http://www.w3.org/2001/XMLSchema-instance";
[XmlIgnore]
public const string Namespace = "http://www.w3.org/2001/XMLSchema";
//private fields
private XmlSchemaForm attributeFormDefault ;
private XmlSchemaObjectTable attributeGroups ;
private XmlSchemaObjectTable attributes ;
private XmlSchemaDerivationMethod blockDefault ;
private XmlSchemaForm elementFormDefault ;
private XmlSchemaObjectTable elements ;
private XmlSchemaDerivationMethod finalDefault ;
private XmlSchemaObjectTable groups ;
private string id ;
private XmlSchemaObjectCollection includes ;
private bool isCompiled ;
private XmlSchemaObjectCollection items ;
private XmlSchemaObjectTable notations ;
private XmlSchemaObjectTable schemaTypes ;
private string targetNamespace ;
private XmlAttribute[] unhandledAttributes ;
private string version;
private string language;
public XmlSchema()
{
attributeFormDefault= XmlSchemaForm.None;
blockDefault = XmlSchemaDerivationMethod.None;
elementFormDefault = XmlSchemaForm.None;
finalDefault = XmlSchemaDerivationMethod.None;
includes = new XmlSchemaObjectCollection();
isCompiled = false;
items = new XmlSchemaObjectCollection();
}
#region Properties
[DefaultValue(XmlSchemaForm.None)]
[System.Xml.Serialization.XmlAttribute("attributeFormDefault")]
public XmlSchemaForm AttributeFormDefault
{
get{ return attributeFormDefault; }
set{ this.attributeFormDefault = value;}
}
[XmlIgnore]
public XmlSchemaObjectTable AttributeGroups
{
get{ return attributeGroups; }
}
[XmlIgnore]
public XmlSchemaObjectTable Attributes
{
get{ return attributes;}
}
[DefaultValue(XmlSchemaDerivationMethod.None)]
[System.Xml.Serialization.XmlAttribute("blockDefault")]
public XmlSchemaDerivationMethod BlockDefault
{
get{ return blockDefault;}
set{ blockDefault = value;}
}
[DefaultValue(XmlSchemaForm.None)]
[System.Xml.Serialization.XmlAttribute("elementFormDefault")]
public XmlSchemaForm ElementFormDefault
{
get{ return elementFormDefault;}
set{ elementFormDefault = value;}
}
[XmlIgnore]
public XmlSchemaObjectTable Elements
{
get{ return elements;}
}
[DefaultValue(XmlSchemaDerivationMethod.None)]
[System.Xml.Serialization.XmlAttribute("finalDefault")]
public XmlSchemaDerivationMethod FinalDefault
{
get{ return finalDefault;}
set{ finalDefault = value;}
}
[XmlIgnore]
public XmlSchemaObjectTable Groups
{
get{ return groups;}
}
[System.Xml.Serialization.XmlAttribute("id")]
public string Id
{
get{ return id;}
set{ id = value;}
}
[XmlElement("include",typeof(XmlSchemaInclude),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("import",typeof(XmlSchemaImport),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("redefine",typeof(XmlSchemaRedefine),Namespace="http://www.w3.org/2001/XMLSchema")]
public XmlSchemaObjectCollection Includes
{
get{ return includes;}
}
[XmlIgnore]
public bool IsCompiled
{
get{ return isCompiled;}
}
[XmlElement("simpleType",typeof(XmlSchemaSimpleType),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("complexType",typeof(XmlSchemaComplexType),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("group",typeof(XmlSchemaGroup),Namespace="http://www.w3.org/2001/XMLSchema")]
//Only Schema's attributeGroup has type XmlSchemaAttributeGroup.
//Others (complextype, restrictions etc) must have XmlSchemaAttributeGroupRef
[XmlElement("attributeGroup",typeof(XmlSchemaAttributeGroup),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("element",typeof(XmlSchemaElement),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("attribute",typeof(XmlSchemaAttribute),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("notation",typeof(XmlSchemaNotation),Namespace="http://www.w3.org/2001/XMLSchema")]
[XmlElement("annotation",typeof(XmlSchemaAnnotation),Namespace="http://www.w3.org/2001/XMLSchema")]
public XmlSchemaObjectCollection Items
{
get{ return items;}
}
[XmlIgnore]
public XmlSchemaObjectTable Notations
{
get{ return notations;}
}
[XmlIgnore]
public XmlSchemaObjectTable SchemaTypes
{
get{ return schemaTypes;}
}
[System.Xml.Serialization.XmlAttribute("targetNamespace")]
public string TargetNamespace
{
get{ return targetNamespace;}
set{ targetNamespace = value;}
}
[XmlAnyAttribute]
public XmlAttribute[] UnhandledAttributes
{
get{ return unhandledAttributes;}
set{ unhandledAttributes = value;}
}
[System.Xml.Serialization.XmlAttribute("version")]
public string Version
{
get{ return version;}
set{ version = value;}
}
// New attribute defined in W3C schema element
[System.Xml.Serialization.XmlAttribute("xml:lang")]
public string Language
{
get{ return language; }
set{ language = value; }
}
#endregion
// Methods
[MonoTODO]
public void Compile(ValidationEventHandler validationEventHandler)
{
attributeGroups = null;
}
public static XmlSchema Read(TextReader reader, ValidationEventHandler validationEventHandler)
{
return Read(new XmlTextReader(reader),validationEventHandler);
}
public static XmlSchema Read(Stream stream, ValidationEventHandler validationEventHandler)
{
return Read(new XmlTextReader(stream),validationEventHandler);
}
//
private static void Serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
Console.WriteLine("Unknown Attribute");
Console.WriteLine("\t" + e.Attr.Name + " " + e.Attr.InnerXml);
Console.WriteLine("\t LineNumber: " + e.LineNumber);
Console.WriteLine("\t LinePosition: " + e.LinePosition);
}
private static void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
Console.WriteLine("Unknown Element");
Console.WriteLine("\t" + e.Element.Name + " " + e.Element.InnerXml);
Console.WriteLine("\t LineNumber: " + e.LineNumber);
Console.WriteLine("\t LinePosition: " + e.LinePosition);
}
private static void Serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
Console.WriteLine("Unknown Node");
Console.WriteLine("\t" + e.Name + " " + e.Text);
Console.WriteLine("\t LineNumber: " + e.LineNumber);
Console.WriteLine("\t LinePosition: " + e.LinePosition);
}
private static void Serializer_UnknownAttribute(object sender, UnreferencedObjectEventArgs e)
{
Console.WriteLine("Unknown");
Console.WriteLine("\t" + e.UnreferencedId);
Console.WriteLine("\t" + e.UnreferencedObject);
}
//
[MonoTODO]
public static XmlSchema Read(XmlReader reader, ValidationEventHandler validationEventHandler)
{
XmlSerializer xser = new XmlSerializer(typeof(XmlSchema));
//
xser.UnknownAttribute += new XmlAttributeEventHandler(Serializer_UnknownAttribute);
xser.UnknownElement += new XmlElementEventHandler(Serializer_UnknownElement);
xser.UnknownNode += new XmlNodeEventHandler(Serializer_UnknownNode);
xser.UnreferencedObject += new UnreferencedObjectEventHandler(Serializer_UnknownAttribute);
//
return (XmlSchema) xser.Deserialize(reader);
}
public void Write(System.IO.Stream stream)
{
Write(stream,null);
}
public void Write(System.IO.TextWriter writer)
{
Write(writer,null);
}
public void Write(System.Xml.XmlWriter writer)
{
Write(writer,null);
}
public void Write(System.IO.Stream stream, System.Xml.XmlNamespaceManager namespaceManager)
{
Write(new XmlTextWriter(stream,null),namespaceManager);
}
public void Write(System.IO.TextWriter writer, System.Xml.XmlNamespaceManager namespaceManager)
{
XmlTextWriter xwriter = new XmlTextWriter(writer);
// This is why the Write was not writing schema with line breaks
xwriter.Formatting = Formatting.Indented;
Write(xwriter,namespaceManager);
}
[MonoTODO]
public void Write(System.Xml.XmlWriter writer, System.Xml.XmlNamespaceManager namespaceManager)
{
XmlSerializerNamespaces xns;
if(Namespaces != null)
{
xns = new XmlSerializerNamespaces(this.Namespaces);
}
else
{
xns = new XmlSerializerNamespaces();
}
if(namespaceManager != null)
{
foreach(string name in namespaceManager)
{
//xml and xmlns namespaced are added by default in namespaceManager.
//So we should ignore them
if(name!="xml" && name != "xmlns")
xns.Add(name,namespaceManager.LookupNamespace(name));
}
}
this.Namespaces = xns;
XmlSerializer xser = new XmlSerializer(typeof(XmlSchema));
xser.Serialize(writer,this,xns);
writer.Flush();
}
}
}