2 // System.Xml.XmlTextWriter
5 // Kral Ferch <kral_ferch@hotmail.com>
14 public abstract class XmlWriter
18 protected WriteState ws = WriteState.Start;
19 protected XmlNamespaceManager namespaceManager = new XmlNamespaceManager (new NameTable ());
25 protected XmlWriter () { }
31 public abstract WriteState WriteState { get; }
33 public abstract string XmlLang { get; }
35 public abstract XmlSpace XmlSpace { get; }
41 public abstract void Close ();
43 public abstract void Flush ();
45 public abstract string LookupPrefix (string ns);
47 [MonoTODO("DTDs must be implemented to use 'defattr' parameter.")]
48 public virtual void WriteAttributes (XmlReader reader, bool defattr)
51 throw new ArgumentException("null XmlReader specified.", "reader");
53 switch(reader.NodeType)
55 case XmlNodeType.XmlDeclaration:
56 // this method doesn't write "<?xml " and "?>", at least MS .NET Framework as yet.
57 XmlDeclaration decl = new XmlDeclaration("1.0", String.Empty, String.Empty, null);
58 decl.Value = reader.Value;
59 if(decl.Version != null && decl.Version != String.Empty) WriteAttributeString("version", decl.Version);
60 if(decl.Encoding != null && decl.Encoding != String.Empty) WriteAttributeString("encoding", decl.Encoding);
61 if(decl.Standalone != null && decl.Standalone != String.Empty) WriteAttributeString("standalone", decl.Standalone);
63 case XmlNodeType.Element:
64 while (reader.MoveToNextAttribute ())
66 WriteAttributeString(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
69 case XmlNodeType.Attribute:
72 WriteAttributeString(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
74 while (reader.MoveToNextAttribute ()) ;
77 throw new XmlException("NodeType is not one of Element, Attribute, nor XmlDeclaration.");
81 public void WriteAttributeString (string localName, string value)
83 WriteAttributeString ("", localName, "", value);
86 public void WriteAttributeString (string localName, string ns, string value)
88 WriteAttributeString ("", localName, ns, value);
91 public void WriteAttributeString (string prefix, string localName, string ns, string value)
93 if ((prefix == "xmlns") || (localName == "xmlns"))
97 if (prefix == "xmlns" && namespaceManager.HasNamespace (localName))
100 /* Users need to be able to re-declare the default namespace for subnodes
101 else if (localName == "xmlns" && namespaceManager.HasNamespace (String.Empty))
106 WriteStartAttribute (prefix, localName, ns);
108 WriteEndAttribute ();
110 if ((prefix == "xmlns") || (localName == "xmlns"))
112 if (prefix == "xmlns")
113 namespaceManager.AddNamespace (localName, ns);
115 namespaceManager.AddNamespace ("", ns);
120 public abstract void WriteBase64 (byte[] buffer, int index, int count);
122 public abstract void WriteBinHex (byte[] buffer, int index, int count);
124 public abstract void WriteCData (string text);
126 public abstract void WriteCharEntity (char ch);
128 public abstract void WriteChars (char[] buffer, int index, int count);
130 public abstract void WriteComment (string text);
132 public abstract void WriteDocType (string name, string pubid, string sysid, string subset);
134 public void WriteElementString (string localName, string value)
136 WriteStartElement(localName);
141 public void WriteElementString (string localName, string ns, string value)
143 WriteStartElement(localName, ns);
148 public abstract void WriteEndAttribute ();
150 public abstract void WriteEndDocument ();
152 public abstract void WriteEndElement ();
154 public abstract void WriteEntityRef (string name);
156 public abstract void WriteFullEndElement ();
158 public abstract void WriteName (string name);
160 public abstract void WriteNmToken (string name);
162 [MonoTODO("needs to test")]
163 public virtual void WriteNode (XmlReader reader, bool defattr)
166 throw new ArgumentException ();
168 if (reader.ReadState == ReadState.Initial) {
169 while (reader.Read ())
170 WriteNode (reader, defattr);
173 switch (reader.NodeType) {
174 case XmlNodeType.Element:
175 WriteStartElement (reader.Prefix, reader.LocalName, reader.NamespaceURI);
176 WriteAttributes (reader, defattr);
177 if (reader.IsEmptyElement)
180 case XmlNodeType.Attribute:
182 case XmlNodeType.Text:
183 WriteString (reader.Value);
185 case XmlNodeType.CDATA:
186 WriteCData (reader.Value);
188 case XmlNodeType.EntityReference:
189 WriteEntityRef (reader.Name);
191 case XmlNodeType.ProcessingInstruction:
192 WriteProcessingInstruction (reader.Name, reader.Value);
194 case XmlNodeType.Comment:
195 WriteComment (reader.Value);
197 case XmlNodeType.DocumentType:
198 WriteDocType (reader.Name,
199 reader ["PUBLIC"], reader ["SYSTEM"], reader.Value);
201 case XmlNodeType.SignificantWhitespace:
202 goto case XmlNodeType.Whitespace;
203 case XmlNodeType.Whitespace:
204 WriteWhitespace (reader.Value);
206 case XmlNodeType.EndElement:
208 case XmlNodeType.EndEntity:
210 case XmlNodeType.XmlDeclaration:
211 WriteStartDocument (reader.GetAttribute ("standalone").ToLower () == "yes");
214 throw new NotImplementedException ();
219 public abstract void WriteProcessingInstruction (string name, string text);
221 public abstract void WriteQualifiedName (string localName, string ns);
223 public abstract void WriteRaw (string data);
225 public abstract void WriteRaw (char[] buffer, int index, int count);
227 public void WriteStartAttribute (string localName, string ns)
229 WriteStartAttribute (null, localName, ns);
232 public abstract void WriteStartAttribute (string prefix, string localName, string ns);
234 public abstract void WriteStartDocument ();
236 public abstract void WriteStartDocument (bool standalone);
238 public void WriteStartElement (string localName)
240 WriteStartElement (null, localName, null);
243 public void WriteStartElement (string localName, string ns)
245 WriteStartElement (null, localName, ns);
248 public abstract void WriteStartElement (string prefix, string localName, string ns);
250 public abstract void WriteString (string text);
252 public abstract void WriteSurrogateCharEntity (char lowChar, char highChar);
254 public abstract void WriteWhitespace (string ws);