//
-// System.Xml.XmlTextWriter
+// System.Xml.XmlWriter
//
-// Author:
+// Authors:
// Kral Ferch <kral_ferch@hotmail.com>
+// Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
//
// (C) 2002 Kral Ferch
+// (C) 2002-2003 Atsushi Enomoto
//
using System;
{
public abstract class XmlWriter
{
- #region Fields
-
- protected WriteState ws = WriteState.Start;
- protected XmlNamespaceManager namespaceManager = new XmlNamespaceManager (new NameTable ());
-
- #endregion
-
#region Constructors
protected XmlWriter () { }
public abstract string LookupPrefix (string ns);
- [MonoTODO("DTDs must be implemented to use 'defattr' parameter.")]
+ private void WriteAttribute (XmlReader reader, bool defattr)
+ {
+ if (!defattr && reader.IsDefault)
+ return;
+
+ WriteStartAttribute (reader.Prefix, reader.LocalName, reader.NamespaceURI);
+ while (reader.ReadAttributeValue ()) {
+ switch (reader.NodeType) {
+ case XmlNodeType.Text:
+ WriteString (reader.Value);
+ break;
+ case XmlNodeType.EntityReference:
+ WriteEntityRef (reader.Name);
+ break;
+ }
+ }
+ WriteEndAttribute ();
+ }
+
public virtual void WriteAttributes (XmlReader reader, bool defattr)
{
if(reader == null)
switch (reader.NodeType) {
case XmlNodeType.XmlDeclaration:
- string val = reader ["version"];
- if (val != String.Empty)
- WriteAttributeString ("version", val);
- val = reader ["encoding"];
- if (val != String.Empty)
- WriteAttributeString ("encoding", val);
- val = reader ["standalone"];
- if(val != String.Empty)
- WriteAttributeString ("standalone", val);
+ WriteAttributeString ("version", reader ["version"]);
+ if (reader ["encoding"] != null)
+ WriteAttributeString ("encoding", reader ["encoding"]);
+ if (reader ["standalone"] != null)
+ WriteAttributeString ("standalone", reader ["standalone"]);
break;
case XmlNodeType.Element:
if (reader.MoveToFirstAttribute ())
break;
case XmlNodeType.Attribute:
do {
- // FIXME: use ReadAttributeValue () for strictly write EntityReference.
- WriteAttributeString (reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value);
+ WriteAttribute (reader, defattr);
} while (reader.MoveToNextAttribute ());
break;
default:
public void WriteAttributeString (string prefix, string localName, string ns, string value)
{
- if ((prefix == "xmlns") || (localName == "xmlns"))
- {
- ns = value;
-
- if (prefix == "xmlns" && namespaceManager.HasNamespace (localName))
- return;
-
- /* Users need to be able to re-declare the default namespace for subnodes
- else if (localName == "xmlns" && namespaceManager.HasNamespace (String.Empty))
- return;
- */
- }
-
+ // In MS.NET (1.0), this check is done *here*, not at WriteStartAttribute.
+ // (XmlTextWriter.WriteStartAttribute("xmlns", "anyname", null) throws an exception.
+ if ((prefix == "xmlns") || (prefix == "" && localName == "xmlns"))
+ if (ns == null)
+ ns = "http://www.w3.org/2000/xmlns/";
+
WriteStartAttribute (prefix, localName, ns);
WriteString (value);
WriteEndAttribute ();
-
- if ((prefix == "xmlns") || (localName == "xmlns"))
- {
- if (prefix == "xmlns")
- namespaceManager.AddNamespace (localName, ns);
- else
- namespaceManager.AddNamespace ("", ns);
- }
-
}
public abstract void WriteBase64 (byte[] buffer, int index, int count);
public abstract void WriteNmToken (string name);
- [MonoTODO("needs to test")]
public virtual void WriteNode (XmlReader reader, bool defattr)
{
if (reader == null)
do {
WriteNode (reader, defattr);
} while (depth < reader.Depth);
- WriteEndElement ();
+ WriteFullEndElement ();
}
break;
// In case of XmlAttribute, don't proceed reader.
case XmlNodeType.EntityReference:
WriteEntityRef (reader.Name);
break;
+ case XmlNodeType.XmlDeclaration:
+ // LAMESPEC: It means that XmlWriter implementation _must not_ check
+ // whether PI name is "xml" (it is XML error) or not.
case XmlNodeType.ProcessingInstruction:
WriteProcessingInstruction (reader.Name, reader.Value);
break;
WriteWhitespace (reader.Value);
break;
case XmlNodeType.EndElement:
- WriteEndElement ();
+ WriteFullEndElement ();
break;
case XmlNodeType.EndEntity:
break;
- case XmlNodeType.XmlDeclaration:
- string st = reader.GetAttribute ("standalone");
- if (st != String.Empty)
- WriteStartDocument (st.ToLower () == "yes");
- else
- WriteStartDocument ();
- break;
+ case XmlNodeType.None:
+ return; // Do nothing, nor reporting errors.
default:
- throw new NotImplementedException ();
+ throw new XmlException ("Unexpected node " + reader.Name + " of type " + reader.NodeType);
}
reader.Read ();
}