2006-01-06 Atsushi Enomoto <atsushi@ximian.com>
authorAtsushi Eno <atsushieno@gmail.com>
Fri, 6 Jan 2006 11:56:08 +0000 (11:56 -0000)
committerAtsushi Eno <atsushieno@gmail.com>
Fri, 6 Jan 2006 11:56:08 +0000 (11:56 -0000)
* XmlWriter.cs : In WriteNode(XPathNavigator, bool), Avoid
  ReadSubtree() for non-element content since they are not allowed
  in ReadSubtree() (but allowed here).

* XPathNavigator.cs : use WriteNode(XPathNavigator, bool)
  rather than WriteNode(XmlWriter, bool) in WriteSubtree().

* XmlWriterTests.cs : added tests for WriteNode(XPathNavigator, bool)
  as well as XPathNavigator.WriteSubtree(XmlWriter).

svn path=/trunk/mcs/; revision=55143

mcs/class/System.XML/System.Xml.XPath/ChangeLog
mcs/class/System.XML/System.Xml.XPath/XPathNavigator.cs
mcs/class/System.XML/System.Xml/ChangeLog
mcs/class/System.XML/System.Xml/XmlWriter.cs
mcs/class/System.XML/Test/System.Xml/ChangeLog
mcs/class/System.XML/Test/System.Xml/XmlWriterTests.cs

index a0043a953df03caa009758bb49b49d3d5779adc5..b33e228bf3bc855269833708a1856b6a36f20fb6 100644 (file)
@@ -1,3 +1,8 @@
+2006-01-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * XPathNavigator.cs : use WriteNode(XPathNavigator, bool)
+         rather than WriteNode(XmlWriter, bool) in WriteSubtree().
+
 2005-12-14  Atsushi Enomoto <atsushi@ximian.com>
 
        * XPathNavigator.cs : Added MonoTODO to CreateAttributes(). Removed
index ddb6a94a5294250de4759331c059376650841c42..af36dba1aec45f29004024f8b50e3db7889483d3 100644 (file)
@@ -868,11 +868,9 @@ namespace System.Xml.XPath
                        throw new NotImplementedException ();
                }
 
-               [MonoTODO]
                public virtual void WriteSubtree (XmlWriter writer)
                {
-                       XmlReader st = ReadSubtree ();
-                       writer.WriteNode (st, false);
+                       writer.WriteNode (this, false);
                }
 
                [MonoTODO]
index d30ee0e34e49c6d2d3d5520672fa8de0ef0dbf09..c7d7c29587913eb0eb12b600ec9e483a192daa28 100644 (file)
@@ -1,3 +1,9 @@
+2006-01-06  Atsushi Enomoto <atsushi@ximian.com>
+
+       * XmlWriter.cs : In WriteNode(XPathNavigator, bool), Avoid
+         ReadSubtree() for non-element content since they are not allowed
+         in ReadSubtree() (but allowed here).
+
 2006-01-06  Atsushi Enomoto <atsushi@ximian.com>
 
        * XmlValidatingReader.cs : In ReadTypedValue(), treat Whitespace
index a987dd350737b5ed2f2493ba93632956eb22ec23..3870f7e7df6e4db178ddcda3f5c170d3b6038bed 100644 (file)
@@ -405,7 +405,7 @@ namespace System.Xml
                }
 
 #if NET_2_0
-               [MonoTODO ("defattr handling")]
+               [MonoTODO ("test defattr handling")]
                public virtual void WriteNode (XPathNavigator navigator, bool defattr)
                {
                        if (navigator == null)
@@ -413,7 +413,27 @@ namespace System.Xml
                        switch (navigator.NodeType) {
                        case XPathNodeType.Attribute:
                        case XPathNodeType.Namespace:
-                               WriteAttributeString (navigator.Prefix, navigator.LocalName, navigator.NamespaceURI, navigator.Value);
+                               if (defattr || navigator.SchemaInfo == null ||
+                                   !navigator.SchemaInfo.IsDefault)
+                                       WriteAttributeString (navigator.Prefix, 
+                                               navigator.LocalName,
+                                               navigator.NamespaceURI,
+                                               navigator.Value);
+                               break;
+                       case XPathNodeType.Text:
+                               WriteString (navigator.Value);
+                               break;
+                       case XPathNodeType.SignificantWhitespace:
+                               WriteWhitespace (navigator.Value);
+                               break;
+                       case XPathNodeType.Whitespace:
+                               WriteWhitespace (navigator.Value);
+                               break;
+                       case XPathNodeType.Comment:
+                               WriteComment (navigator.Value);
+                               break;
+                       case XPathNodeType.ProcessingInstruction:
+                               WriteProcessingInstruction (navigator.Name, navigator.Value);
                                break;
                        default:
                                WriteNode (navigator.ReadSubtree (), defattr);
index d8c563d1beaeb3548df1f27ad3ba719bddb1cc0e..441ca9c9bfa9b3e5dbe754da8178e3989ce74ca4 100644 (file)
@@ -1,3 +1,8 @@
+2006-01-06  Atsushi Enomoto  <atsushi@ximian.com>
+
+       * XmlWriterTests.cs : added tests for WriteNode(XPathNavigator, bool)
+         as well as XPathNavigator.WriteSubtree(XmlWriter).
+
 2006-01-06  Atsushi Enomoto  <atsushi@ximian.com>
 
        * XsdValidatingReaderTests.cs : test for ReadTypeValue() that it
index a8a85cfc523b8e5af5b43e6b87c5d95c0d3e5b16..e6918c8199b3ab8de8775e80cb313417d3cb0cb3 100644 (file)
@@ -16,9 +16,12 @@ using System;
 using System.IO;\r
 using System.Text;\r
 using System.Xml;\r
+using System.Xml.XPath;\r
 \r
 using NUnit.Framework;\r
 \r
+using AssertType = NUnit.Framework.Assert;\r
+\r
 namespace MonoTests.System.Xml\r
 {\r
        [TestFixture]\r
@@ -202,6 +205,76 @@ namespace MonoTests.System.Xml
                        xtw.Close ();\r
                        Assert.AreEqual (xml, writer.ToString ());\r
                }\r
+\r
+#if NET_2_0\r
+\r
+               XPathNavigator GetNavigator (string xml)\r
+               {\r
+                       return new XPathDocument (XmlReader.Create (\r
+                               new StringReader (xml))).CreateNavigator ();\r
+               }\r
+\r
+               string WriteNavigator (XPathNavigator nav, bool defattr)\r
+               {\r
+                       StringWriter sw = new StringWriter ();\r
+                       XmlWriterSettings settings = new XmlWriterSettings ();\r
+                       settings.OmitXmlDeclaration = true;\r
+                       settings.ConformanceLevel = ConformanceLevel.Fragment;\r
+                       using (XmlWriter w = XmlWriter.Create (sw, settings)) {\r
+                               w.WriteNode (nav, defattr);\r
+                       }\r
+                       return sw.ToString ();\r
+               }\r
+\r
+               [Test]\r
+               public void WriteNodeNavigator1 ()\r
+               {\r
+                       XPathNavigator nav = GetNavigator ("<root>test<!-- comment --></root>");\r
+                       // at Root\r
+                       AssertType.AreEqual ("<root>test<!-- comment --></root>", WriteNavigator (nav, false), "#1");\r
+                       // at document element\r
+                       nav.MoveToFirstChild ();\r
+                       AssertType.AreEqual ("<root>test<!-- comment --></root>", WriteNavigator (nav, false), "#2");\r
+                       // at text\r
+                       nav.MoveToFirstChild ();\r
+                       AssertType.AreEqual ("test", WriteNavigator (nav, false), "#3");\r
+\r
+                       // at comment\r
+                       nav.MoveToNext ();\r
+                       AssertType.AreEqual ("<!-- comment -->", WriteNavigator (nav, false), "#4");\r
+               }\r
+\r
+               string WriteSubtree (XPathNavigator nav)\r
+               {\r
+                       StringWriter sw = new StringWriter ();\r
+                       XmlWriterSettings settings = new XmlWriterSettings ();\r
+                       settings.OmitXmlDeclaration = true;\r
+                       settings.ConformanceLevel = ConformanceLevel.Fragment;\r
+                       using (XmlWriter w = XmlWriter.Create (sw, settings)) {\r
+                               nav.WriteSubtree(w);\r
+                       }\r
+                       return sw.ToString ();\r
+               }\r
+\r
+               [Test]\r
+               public void NavigatorWriteSubtree1 ()\r
+               {\r
+                       XPathNavigator nav = GetNavigator ("<root>test<!-- comment --></root>");\r
+                       // at Root\r
+                       AssertType.AreEqual ("<root>test<!-- comment --></root>", WriteSubtree (nav), "#1");\r
+                       // at document element\r
+                       nav.MoveToFirstChild ();\r
+                       AssertType.AreEqual ("<root>test<!-- comment --></root>", WriteSubtree (nav), "#2");\r
+                       // at text\r
+                       nav.MoveToFirstChild ();\r
+                       AssertType.AreEqual ("test", WriteSubtree (nav), "#3");\r
+\r
+                       // at comment\r
+                       nav.MoveToNext ();\r
+                       AssertType.AreEqual ("<!-- comment -->", WriteSubtree (nav), "#4");\r
+               }\r
+#endif\r
+\r
        }\r
 \r
        internal class DefaultXmlWriter : XmlWriter\r