2004-03-15 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Mon, 15 Mar 2004 04:49:47 +0000 (04:49 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Mon, 15 Mar 2004 04:49:47 +0000 (04:49 -0000)
* RelaxngGrammar.cs,
  RelaxngNameClass.cs,
  RelaxngPattern.cs : Added Write() support.

svn path=/trunk/mcs/; revision=24040

mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngGrammar.cs
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngNameClass.cs
mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngPattern.cs

index dc32ef4a495a6461a440803bc3d978ca87424730..41aeac72dcd3b23b2ff8571a52bf812dba198fc0 100644 (file)
@@ -1,3 +1,9 @@
+2004-03-15  Atsushi Enomoto <atsushi@ximian.com>
+
+       * RelaxngGrammar.cs,
+         RelaxngNameClass.cs,
+         RelaxngPattern.cs : Added Write() support.
+
 2004-02-28  Atsushi Enomoto <atsushi@ximian.com>
 
        * RelaxngReader.cs : ReadPattern() should be public.
index 6922814fd9aa27932053c3290041a3051b439ee2..f8ac7a6be59d16a614835643f44715e3493ecdbc 100644 (file)
@@ -91,6 +91,20 @@ namespace Commons.Xml.Relaxng
                        get { return divs; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "grammar", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngStart start in Starts)\r
+                               start.Write (writer);\r
+                       foreach (RelaxngDefine define in Defines)\r
+                               define.Write (writer);\r
+                       foreach (RelaxngInclude include in Includes)\r
+                               include.Write (writer);\r
+                       foreach (RelaxngDiv div in Divs)\r
+                               div.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal Hashtable IncludedUris {\r
                        get { return includedUris; }\r
                }\r
index f64080a4cda8633edfd362932b90414331ad50a0..109346507f945f6aa0c7eb1095770614e6c67acb 100644 (file)
@@ -48,6 +48,19 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public RelaxngExceptNameClass Except {\r
+                       get { return except; }\r
+                       set { except = value; }\r
+               }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "anyName", RelaxngGrammar.NamespaceURI);\r
+                       if (except != null)\r
+                               except.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpNameClass Compile (RelaxngGrammar g)\r
                {\r
                        if (except != null) {\r
@@ -59,11 +72,6 @@ namespace Commons.Xml.Relaxng
                                return RdpAnyName.Instance;\r
                }\r
 \r
-               public RelaxngExceptNameClass Except {\r
-                       get { return except; }\r
-                       set { except = value; }\r
-               }\r
-\r
                internal override void CheckConstraints (bool rejectAnyName, bool rejectNsName) \r
                {\r
                        if (rejectAnyName)\r
@@ -93,6 +101,14 @@ namespace Commons.Xml.Relaxng
                        set { except = value; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "nsName", RelaxngGrammar.NamespaceURI);\r
+                       if (except != null)\r
+                               except.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpNameClass Compile (RelaxngGrammar g)\r
                {\r
                        if (except != null) {\r
@@ -145,6 +161,15 @@ namespace Commons.Xml.Relaxng
                        set { ns = value; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "name", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("ns", ns);\r
+                       // Here we just skip qname\r
+                       writer.WriteString (ncname);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpNameClass Compile (RelaxngGrammar g)\r
                {\r
                        return new RdpName (ncname, ns);\r
@@ -164,6 +189,19 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public ArrayList Children {\r
+                       get { return names; }\r
+                       set { names = value; }\r
+               }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "choice", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngNameClass nc in Children)\r
+                               nc.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpNameClass Compile (RelaxngGrammar g)\r
                {\r
                        // Flatten names into RdpChoice. See 4.12.\r
@@ -178,11 +216,6 @@ namespace Commons.Xml.Relaxng
                        return p;\r
                }\r
 \r
-               public ArrayList Children {\r
-                       get { return names; }\r
-                       set { names = value; }\r
-               }\r
-\r
                internal override void CheckConstraints (bool rejectAnyName, bool rejectNsName) \r
                {\r
                        foreach (RelaxngNameClass nc in names)\r
@@ -198,6 +231,19 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public ArrayList Names {\r
+                       get { return names; }\r
+                       set { names = value; }\r
+               }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "except", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngNameClass nc in Names)\r
+                               nc.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal RdpNameClass Compile (RelaxngGrammar g)\r
                {\r
                        // Flatten names into RdpGroup. See 4.12.\r
@@ -211,10 +257,5 @@ namespace Commons.Xml.Relaxng
                        }\r
                        return p;\r
                }\r
-\r
-               public ArrayList Names {\r
-                       get { return names; }\r
-                       set { names = value; }\r
-               }\r
        }\r
 }\r
index 35561b53efba1cbd8eede659592d5120309660b0..e95188969be878f856445294b670d8af9ad2a009 100644 (file)
@@ -41,6 +41,8 @@ namespace Commons.Xml.Relaxng
                        get { return baseUri; }\r
                        set { baseUri = value; }\r
                }\r
+\r
+               public abstract void Write (XmlWriter write);\r
        }\r
 \r
        public abstract class RelaxngSingleContentPattern : RelaxngPattern\r
@@ -138,6 +140,15 @@ namespace Commons.Xml.Relaxng
                        set { p = value; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "start", RelaxngGrammar.NamespaceURI);\r
+                       if (combine != null)\r
+                               writer.WriteAttributeString ("combine", combine);\r
+                       p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        return p.Compile (grammar);\r
@@ -150,6 +161,10 @@ namespace Commons.Xml.Relaxng
                private RelaxngPatternList patterns = new RelaxngPatternList ();\r
                string combine;\r
 \r
+               public RelaxngDefine ()\r
+               {\r
+               }\r
+\r
                public RelaxngPatternList Patterns {\r
                        get { return patterns; }\r
                }\r
@@ -159,6 +174,27 @@ namespace Commons.Xml.Relaxng
                        set { combine = value; }\r
                }\r
 \r
+               public string Name {\r
+                       get { return name; }\r
+                       set { name = value; }\r
+               }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "define", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("name", name);\r
+                       if (combine != null)\r
+                               writer.WriteAttributeString ("combine", combine);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
+               internal RdpPattern Compile (RelaxngGrammar grammar)\r
+               {\r
+                       return makeSingle (grammar);\r
+               }\r
+\r
                private RdpPattern makeSingle (RelaxngGrammar g)\r
                {\r
                        // Flatten patterns into RdpGroup. See 4.12.\r
@@ -173,20 +209,6 @@ namespace Commons.Xml.Relaxng
                        }\r
                        return p;\r
                }\r
-\r
-               public RelaxngDefine ()\r
-               {\r
-               }\r
-\r
-               public string Name {\r
-                       get { return name; }\r
-                       set { name = value; }\r
-               }\r
-\r
-               internal RdpPattern Compile (RelaxngGrammar grammar)\r
-               {\r
-                       return makeSingle (grammar);\r
-               }\r
        }\r
 \r
        public class RelaxngInclude : RelaxngElementBase\r
@@ -223,6 +245,19 @@ namespace Commons.Xml.Relaxng
                        set { ns = value; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "include", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("href", href);\r
+                       foreach (RelaxngStart start in Starts)\r
+                               start.Write (writer);\r
+                       foreach (RelaxngDefine define in Defines)\r
+                               define.Write (writer);\r
+                       foreach (RelaxngDiv div in Divs)\r
+                               div.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                // compile into div\r
                internal RelaxngDiv Compile (RelaxngGrammar grammar)\r
                {\r
@@ -317,6 +352,20 @@ namespace Commons.Xml.Relaxng
                        get { return divs; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "div", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngStart start in Starts)\r
+                               start.Write (writer);\r
+                       foreach (RelaxngDefine define in Defines)\r
+                               define.Write (writer);\r
+                       foreach (RelaxngInclude include in Includes)\r
+                               include.Write (writer);\r
+                       foreach (RelaxngDiv div in Divs)\r
+                               div.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal void Compile (RelaxngGrammar grammar)\r
                {\r
                        foreach (RelaxngDiv div in divs)\r
@@ -420,6 +469,11 @@ namespace Commons.Xml.Relaxng
                        set { this.List [i] = value; }\r
                }\r
 \r
+               public void Insert (int pos, RelaxngPattern p)\r
+               {\r
+                       List.Insert (pos, p);\r
+               }\r
+\r
                public void Remove (RelaxngPattern p)\r
                {\r
                        List.Remove (p);\r
@@ -437,6 +491,12 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.NotAllowed; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "notAllowed", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        return RdpNotAllowed.Instance;\r
@@ -458,6 +518,12 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Empty; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "empty", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        return RdpEmpty.Instance;\r
@@ -479,6 +545,12 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Text; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "text", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        return RdpText.Instance;\r
@@ -524,6 +596,33 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Data; }\r
                }\r
 \r
+               public RelaxngParamList ParamList {\r
+                       get { return paramList; }\r
+               }\r
+\r
+               public RelaxngExcept Except {\r
+                       get { return except; }\r
+                       set { except = value; }\r
+               }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "data", RelaxngGrammar.NamespaceURI);\r
+                       if (DatatypeLibrary != null && DatatypeLibrary != String.Empty)\r
+                               writer.WriteAttributeString ("xmlns", "data", "http://www.w3.org/2000/xmlns/", DatatypeLibrary);\r
+                       writer.WriteStartAttribute ("type", String.Empty);\r
+                       writer.WriteQualifiedName (Type, DatatypeLibrary);\r
+                       writer.WriteEndAttribute ();\r
+\r
+                       foreach (RelaxngParam p in ParamList)\r
+                               p.Write (writer);\r
+\r
+                       if (Except != null)\r
+                               Except.Write (writer);\r
+\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
 //                     RdpParamList rdpl = new RdpParamList ();\r
@@ -546,15 +645,6 @@ namespace Commons.Xml.Relaxng
                                return new RdpData (new RdpDatatype (DatatypeLibrary, Type, ParamList, grammar.Provider));\r
                }\r
 \r
-               public RelaxngParamList ParamList {\r
-                       get { return paramList; }\r
-               }\r
-\r
-               public RelaxngExcept Except {\r
-                       get { return except; }\r
-                       set { except = value; }\r
-               }\r
-\r
                internal override void CheckConstraints () \r
                {\r
                        CheckDatatypeName ();\r
@@ -569,6 +659,25 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Value; }\r
                }\r
 \r
+               public string Value {\r
+                       get { return value; }\r
+                       set { this.value = value; }\r
+               }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "value", RelaxngGrammar.NamespaceURI);\r
+                       if (Type != null) {\r
+                               writer.WriteStartAttribute ("type", String.Empty);\r
+                               if (DatatypeLibrary != null && DatatypeLibrary != String.Empty)\r
+                                       writer.WriteAttributeString ("xmlns", "data", "http://www.w3.org/2000/xmlns/", DatatypeLibrary);\r
+                               writer.WriteQualifiedName (Type, DatatypeLibrary);\r
+                               writer.WriteEndAttribute ();\r
+                       }\r
+                       writer.WriteString (Value);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -576,11 +685,6 @@ namespace Commons.Xml.Relaxng
                                Type, null, grammar.Provider), value);\r
                }\r
 \r
-               public string Value {\r
-                       get { return value; }\r
-                       set { this.value = value; }\r
-               }\r
-\r
                internal override void CheckConstraints () \r
                {\r
                        CheckDatatypeName ();\r
@@ -589,8 +693,6 @@ namespace Commons.Xml.Relaxng
 \r
        public class RelaxngList : RelaxngSingleContentPattern\r
        {\r
-               IList patterns = new ArrayList ();\r
-\r
                internal RelaxngList ()\r
                {\r
                }\r
@@ -599,6 +701,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.List; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "list", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
 \r
@@ -615,7 +725,6 @@ namespace Commons.Xml.Relaxng
        public class RelaxngElement : RelaxngSingleContentPattern\r
        {\r
                RelaxngNameClass nc;\r
-               ArrayList patterns = new ArrayList ();\r
 \r
                public RelaxngElement ()\r
                {\r
@@ -630,6 +739,15 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Element; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "element", RelaxngGrammar.NamespaceURI);\r
+                       nc.Write (writer);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        return new RdpElement (\r
@@ -654,10 +772,29 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public RelaxngPattern Pattern {\r
+                       get { return p; }\r
+                       set { p = value; }\r
+               }\r
+\r
+               public RelaxngNameClass NameClass {\r
+                       get { return nc; }\r
+                       set { nc = value; }\r
+               }\r
+\r
                public override RelaxngPatternType PatternType {\r
                        get { return RelaxngPatternType.Attribute; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "attribute", RelaxngGrammar.NamespaceURI);\r
+                       nc.Write (writer);\r
+                       if (p != null)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                private void checkInvalidAttrNameClass (RdpNameClass nc)\r
                {\r
                        string xmlnsNS = "http://www.w3.org/2000/xmlns";\r
@@ -703,16 +840,6 @@ namespace Commons.Xml.Relaxng
                                        RdpText.Instance);\r
                }\r
 \r
-               public RelaxngPattern Pattern {\r
-                       get { return p; }\r
-                       set { p = value; }\r
-               }\r
-\r
-               public RelaxngNameClass NameClass {\r
-                       get { return nc; }\r
-                       set { nc = value; }\r
-               }\r
-\r
                internal override void CheckConstraints () \r
                {\r
                        NameClass.CheckConstraints (false, false);\r
@@ -806,10 +933,22 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public string Name {\r
+                       get { return name; }\r
+                       set { name = value; }\r
+               }\r
+\r
                public override RelaxngPatternType PatternType {\r
                        get { return RelaxngPatternType.Ref; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "ref", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("name", name);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        // Important!! This compile method only generates stub.\r
@@ -817,11 +956,6 @@ namespace Commons.Xml.Relaxng
                        return new RdpUnresolvedRef (name, grammar);\r
                }\r
 \r
-               public string Name {\r
-                       get { return name; }\r
-                       set { name = value; }\r
-               }\r
-\r
                internal override void CheckConstraints () \r
                {\r
                        // nothing to check\r
@@ -836,21 +970,28 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public string Name {\r
+                       get { return name; }\r
+                       set { name = value; }\r
+               }\r
+\r
                public override RelaxngPatternType PatternType {\r
                        get { return RelaxngPatternType.ParentRef; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "parentRef", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("name", name);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = false;\r
                        return new RdpUnresolvedRef (name, grammar.ParentGrammar);\r
                }\r
 \r
-               public string Name {\r
-                       get { return name; }\r
-                       set { name = value; }\r
-               }\r
-\r
                internal override void CheckConstraints () \r
                {\r
                        // nothing to check\r
@@ -866,10 +1007,27 @@ namespace Commons.Xml.Relaxng
                {\r
                }\r
 \r
+               public string Href {\r
+                       get { return href; }\r
+                       set { href = value; }\r
+               }\r
+\r
+               public string NSContext {\r
+                       get { return ns; }\r
+                       set { ns = value; }\r
+               }\r
+\r
                public override RelaxngPatternType PatternType {\r
                        get { return RelaxngPatternType.ExternalRef; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "externalRef", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("href", Href);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        grammar.CheckIncludeRecursion (Href);\r
@@ -887,16 +1045,6 @@ namespace Commons.Xml.Relaxng
                        return ret;\r
                }\r
 \r
-               public string Href {\r
-                       get { return href; }\r
-                       set { href = value; }\r
-               }\r
-\r
-               public string NSContext {\r
-                       get { return ns; }\r
-                       set { ns = value; }\r
-               }\r
-\r
                internal override void CheckConstraints () \r
                {\r
                        // nothing to check\r
@@ -913,6 +1061,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.OneOrMore; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "oneOrMore", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -930,6 +1086,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.ZeroOrMore; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "zeroOrMore", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -949,6 +1113,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Optional; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "optional", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -967,6 +1139,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Mixed; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "mixed", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -984,6 +1164,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Choice; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "choice", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -1001,6 +1189,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Group; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "group", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -1018,6 +1214,14 @@ namespace Commons.Xml.Relaxng
                        get { return RelaxngPatternType.Interleave; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "interleave", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal override RdpPattern Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -1050,6 +1254,14 @@ namespace Commons.Xml.Relaxng
                        set { this.value = value; }\r
                }\r
 \r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "param", RelaxngGrammar.NamespaceURI);\r
+                       writer.WriteAttributeString ("name", name);\r
+                       writer.WriteString (Value);\r
+                       writer.WriteEndElement ();\r
+               }\r
+\r
                internal RdpParam Compile (RelaxngGrammar grammar)\r
                {\r
                        IsCompiled = true;\r
@@ -1073,6 +1285,11 @@ namespace Commons.Xml.Relaxng
                        set { this.List [i] = value; }\r
                }\r
 \r
+               public void Insert (int pos, RelaxngParam p)\r
+               {\r
+                       List.Insert (pos, p);\r
+               }\r
+\r
                public void Remove (RelaxngParam p)\r
                {\r
                        List.Remove (p);\r
@@ -1090,6 +1307,14 @@ namespace Commons.Xml.Relaxng
                public RelaxngPatternList Patterns {\r
                        get { return patterns; }\r
                }\r
+\r
+               public override void Write (XmlWriter writer)\r
+               {\r
+                       writer.WriteStartElement ("", "except", RelaxngGrammar.NamespaceURI);\r
+                       foreach (RelaxngPattern p in Patterns)\r
+                               p.Write (writer);\r
+                       writer.WriteEndElement ();\r
+               }\r
        }\r
 \r
        public class RelaxngRefPattern\r