{
#region Fields
- protected TextWriter w;
- protected bool nullEncoding = false;
- protected bool openWriter = true;
- protected bool openStartElement = false;
- protected bool openStartAttribute = false;
- protected bool documentStarted = false;
- private bool namespaces = true;
- protected bool openAttribute = false;
- protected bool attributeWrittenForElement = false;
- protected Stack openElements = new Stack ();
- private Formatting formatting = Formatting.None;
- private int indentation = 2;
- private char indentChar = ' ';
- protected string indentChars = " ";
- private char quoteChar = '\"';
- protected int indentLevel = 0;
- protected string indentFormatting;
- protected Stream baseStream = null;
- protected string xmlLang = null;
- protected XmlSpace xmlSpace = XmlSpace.None;
- protected bool openXmlLang = false;
- protected bool openXmlSpace = false;
+ TextWriter w;
+ bool nullEncoding = false;
+ bool openWriter = true;
+ bool openStartElement = false;
+ bool openStartAttribute = false;
+ bool documentStarted = false;
+ bool namespaces = true;
+ bool openAttribute = false;
+ bool attributeWrittenForElement = false;
+ Stack openElements = new Stack ();
+ Formatting formatting = Formatting.None;
+ int indentation = 2;
+ char indentChar = ' ';
+ string indentChars = " ";
+ char quoteChar = '\"';
+ int indentLevel = 0;
+ string indentFormatting;
+ Stream baseStream = null;
+ string xmlLang = null;
+ XmlSpace xmlSpace = XmlSpace.None;
+ bool openXmlLang = false;
+ bool openXmlSpace = false;
#endregion
baseStream = w;
}
- public XmlTextWriter (string filename, Encoding encoding) : base ()
+ public XmlTextWriter (string filename, Encoding encoding) :
+ this (new FileStream (filename, FileMode.Create, FileAccess.Write, FileShare.None), encoding)
{
- this.w = new StreamWriter(filename, false, encoding);
- baseStream = ((StreamWriter)w).BaseStream;
}
#endregion
set { formatting = value; }
}
- public bool IndentingOverriden
+ private bool IndentingOverriden
{
get {
if (openElements.Count == 0)
w.Write ("<!--{0}-->", text);
}
- [MonoTODO]
public override void WriteDocType (string name, string pubid, string sysid, string subset)
{
- throw new NotImplementedException ();
+ if (name == null || name.Trim ().Length == 0)
+ throw new ArgumentException ("Invalid DOCTYPE name", "name");
+
+ w.Write ("<!DOCTYPE ");
+ w.Write (name);
+ if (pubid != null) {
+ w.Write (String.Format (" PUBLIC {0}{1}{0} {0}{2}{0}", quoteChar, pubid, sysid));
+ } else if (sysid != null) {
+ w.Write (String.Format (" SYSTEM {0}{1}{0}", quoteChar, sysid));
+ }
+
+ if (subset != null)
+ w.Write ("[" + subset + "]");
+
+ w.Write('>');
}
public override void WriteEndAttribute ()
public override void WriteEndDocument ()
{
+ CloseOpenAttributeAndElements ();
+
if ((ws == WriteState.Start) || (ws == WriteState.Prolog))
throw new ArgumentException ("This document does not have a root element.");
- CloseOpenAttributeAndElements ();
-
ws = WriteState.Start;
}
WriteEndElementInternal (true);
}
- [MonoTODO]
+ private void CheckValidChars (string name, bool firstOnlyLetter)
+ {
+ foreach (char c in name) {
+ if (XmlConvert.IsInvalid (c, firstOnlyLetter))
+ throw new ArgumentException ("There is an invalid character: '" + c +
+ "'", "name");
+ }
+ }
+
public override void WriteName (string name)
{
- throw new NotImplementedException ();
+ CheckValidChars (name, true);
+ w.Write (name);
}
- [MonoTODO]
public override void WriteNmToken (string name)
{
- throw new NotImplementedException ();
+ CheckValidChars (name, false);
+ w.Write (name);
}
public override void WriteProcessingInstruction (string name, string text)
WriteStartElementInternal (prefix, localName, ns);
}
- protected override void WriteStartElementInternal (string prefix, string localName, string ns)
+ private void WriteStartElementInternal (string prefix, string localName, string ns)
{
if (prefix == null)
prefix = String.Empty;
if (ns != String.Empty)
{
string existingPrefix = namespaceManager.LookupPrefix (ns);
+ bool addDefaultNamespace = false;
+
+ if (existingPrefix == String.Empty && !namespaceManager.HasNamespace (prefix)) {
+ namespaceManager.AddNamespace (prefix, ns);
+ addDefaultNamespace = true;
+ }
if (prefix == String.Empty)
prefix = existingPrefix;
if (prefix != existingPrefix)
formatXmlns = String.Format (" xmlns:{0}={1}{2}{1}", prefix, quoteChar, ns);
- else if (existingPrefix == String.Empty)
+ else if (addDefaultNamespace)
formatXmlns = String.Format (" xmlns={0}{1}{0}", quoteChar, ns);
}
else if ((prefix == String.Empty) && (namespaceManager.LookupNamespace(prefix) != String.Empty)) {
WriteStringInternal (text, true);
}
- public void WriteStringInternal (string text, bool entitize)
+ private void WriteStringInternal (string text, bool entitize)
{
if (text == null)
text = String.Empty;