X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.XML%2FSystem.Xml%2FXmlWriter.cs;h=0bd2412a08439e3bf306aba935e6e395f5056b79;hb=2a6da5d6f1e6d02f0e3595b3a02af6cacea2772c;hp=4f95f200b2b95b69769cb888645901ca12b841a9;hpb=ad41847caaa5fe7bc69771b0af206b235d24d339;p=mono.git diff --git a/mcs/class/System.XML/System.Xml/XmlWriter.cs b/mcs/class/System.XML/System.Xml/XmlWriter.cs index 4f95f200b2b..0bd2412a084 100644 --- a/mcs/class/System.XML/System.Xml/XmlWriter.cs +++ b/mcs/class/System.XML/System.Xml/XmlWriter.cs @@ -15,8 +15,8 @@ namespace System.Xml { #region Fields - private WriteState ws = WriteState.Start; - private XmlNamespaceManager namespaceManager = new XmlNamespaceManager (new NameTable ()); + protected WriteState ws = WriteState.Start; + protected XmlNamespaceManager namespaceManager = new XmlNamespaceManager (new NameTable ()); #endregion @@ -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); @@ -120,10 +159,61 @@ namespace System.Xml public abstract void WriteNmToken (string name); - [MonoTODO] + [MonoTODO("needs to test")] public virtual void WriteNode (XmlReader reader, bool defattr) { - throw new NotImplementedException (); + if (reader == null) + throw new ArgumentException (); + + if (reader.ReadState == ReadState.Initial) { + while (reader.Read ()) + WriteNode (reader, defattr); + } + else { + switch (reader.NodeType) { + case XmlNodeType.Element: + WriteStartElement (reader.Prefix, reader.LocalName, reader.NamespaceURI); + WriteAttributes (reader, defattr); + if (reader.IsEmptyElement) + WriteEndElement (); + break; + case XmlNodeType.Attribute: + break; + case XmlNodeType.Text: + WriteString (reader.Value); + break; + case XmlNodeType.CDATA: + WriteCData (reader.Value); + break; + case XmlNodeType.EntityReference: + WriteEntityRef (reader.Name); + break; + case XmlNodeType.ProcessingInstruction: + WriteProcessingInstruction (reader.Name, reader.Value); + break; + case XmlNodeType.Comment: + WriteComment (reader.Value); + break; + case XmlNodeType.DocumentType: + WriteDocType (reader.Name, + reader ["PUBLIC"], reader ["SYSTEM"], reader.Value); + break; + case XmlNodeType.SignificantWhitespace: + goto case XmlNodeType.Whitespace; + case XmlNodeType.Whitespace: + WriteWhitespace (reader.Value); + break; + case XmlNodeType.EndElement: + break; + case XmlNodeType.EndEntity: + break; + case XmlNodeType.XmlDeclaration: + WriteStartDocument (reader.GetAttribute ("standalone").ToLower () == "yes"); + break; + default: + throw new NotImplementedException (); + } + } } public abstract void WriteProcessingInstruction (string name, string text); @@ -136,7 +226,7 @@ namespace System.Xml public void WriteStartAttribute (string localName, string ns) { - WriteStartAttribute ("", localName, ns); + WriteStartAttribute (null, localName, ns); } public abstract void WriteStartAttribute (string prefix, string localName, string ns); @@ -147,12 +237,12 @@ namespace System.Xml public void WriteStartElement (string localName) { - WriteStartElement (String.Empty, localName, String.Empty); + WriteStartElement (null, localName, null); } public void WriteStartElement (string localName, string ns) { - WriteStartElement (String.Empty, localName, ns); + WriteStartElement (null, localName, ns); } public abstract void WriteStartElement (string prefix, string localName, string ns);