X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.XML%2FSystem.Xml%2FXmlWriter.cs;h=29050c5f31512e164c8d03426557c6184dbd5aea;hb=879d8fbdcd1e6a59972d878a74760a0d67055062;hp=f1c0b96737cf67f99a92764f2cb8824086ac9830;hpb=cbe4a80d16b6ec4e4905dc7417c63c330ee754ea;p=mono.git diff --git a/mcs/class/System.XML/System.Xml/XmlWriter.cs b/mcs/class/System.XML/System.Xml/XmlWriter.cs index f1c0b96737c..29050c5f315 100644 --- a/mcs/class/System.XML/System.Xml/XmlWriter.cs +++ b/mcs/class/System.XML/System.Xml/XmlWriter.cs @@ -44,10 +44,38 @@ namespace System.Xml public abstract string LookupPrefix (string ns); - [MonoTODO] + [MonoTODO("DTDs must be implemented to use 'defattr' parameter.")] public virtual void WriteAttributes (XmlReader reader, bool defattr) { - throw new NotImplementedException (); + if(reader == null) + throw new ArgumentException("null XmlReader specified.", "reader"); + + switch(reader.NodeType) + { + case XmlNodeType.XmlDeclaration: + // this method doesn't write "", at least MS .NET Framework as yet. + XmlDeclaration decl = new XmlDeclaration("1.0", String.Empty, String.Empty, null); + decl.Value = reader.Value; + if(decl.Version != null && decl.Version != String.Empty) WriteAttributeString("version", decl.Version); + if(decl.Encoding != null && decl.Encoding != String.Empty) WriteAttributeString("encoding", decl.Encoding); + if(decl.Standalone != null && decl.Standalone != String.Empty) WriteAttributeString("standalone", decl.Standalone); + break; + case XmlNodeType.Element: + while (reader.MoveToNextAttribute ()) + { + WriteAttributeString(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value); + } + break; + case XmlNodeType.Attribute: + do + { + WriteAttributeString(reader.Prefix, reader.LocalName, reader.NamespaceURI, reader.Value); + } + while (reader.MoveToNextAttribute ()) ; + break; + default: + throw new XmlException("NodeType is not one of Element, Attribute, nor XmlDeclaration."); + } } public void WriteAttributeString (string localName, string value) @@ -63,7 +91,17 @@ namespace System.Xml 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; + */ + } WriteStartAttribute (prefix, localName, ns); WriteString (value); @@ -76,6 +114,7 @@ namespace System.Xml else namespaceManager.AddNamespace ("", ns); } + } public abstract void WriteBase64 (byte[] buffer, int index, int count); @@ -147,18 +186,16 @@ namespace System.Xml public void WriteStartElement (string localName) { - WriteStartElementInternal ("", localName, ""); + WriteStartElement (String.Empty, localName, String.Empty); } public void WriteStartElement (string localName, string ns) { - WriteStartElement ("", localName, ns); + WriteStartElement (String.Empty, localName, ns); } public abstract void WriteStartElement (string prefix, string localName, string ns); - protected abstract void WriteStartElementInternal (string prefix, string localName, string ns); - public abstract void WriteString (string text); public abstract void WriteSurrogateCharEntity (char lowChar, char highChar);