diff --git a/src/DocumentFormat.OpenXml/OpenXmlPartReader.cs b/src/DocumentFormat.OpenXml/OpenXmlPartReader.cs index 40cf27fa9..e409a3dbe 100644 --- a/src/DocumentFormat.OpenXml/OpenXmlPartReader.cs +++ b/src/DocumentFormat.OpenXml/OpenXmlPartReader.cs @@ -54,7 +54,7 @@ public OpenXmlPartReader(OpenXmlPart openXmlPart) : this() throw new ArgumentNullException(nameof(openXmlPart)); } - _xmlReader = CreateReader(openXmlPart.GetStream(FileMode.Open), true, openXmlPart.MaxCharactersInPart, out _standalone, out _encoding); + _xmlReader = CreateReader(openXmlPart.GetStream(FileMode.Open), true, openXmlPart.MaxCharactersInPart, ignoreWhitespace: true, out _standalone, out _encoding); } /// @@ -70,7 +70,23 @@ public OpenXmlPartReader(OpenXmlPart openXmlPart, bool readMiscNodes) throw new ArgumentNullException(nameof(openXmlPart)); } - _xmlReader = CreateReader(openXmlPart.GetStream(FileMode.Open), true, openXmlPart.MaxCharactersInPart, out _standalone, out _encoding); + _xmlReader = CreateReader(openXmlPart.GetStream(FileMode.Open), true, openXmlPart.MaxCharactersInPart, ignoreWhitespace: true, out _standalone, out _encoding); + } + + /// + /// Initializes a new instance of the OpenXmlPartReader class using the supplied OpenXmlPart and Boolean values. + /// + /// The OpenXmlPart to read. + /// Specify false to indicate to the reader to skip all miscellaneous nodes. + /// Specify true to indicate to the reader to ignore insignificant white space. + public OpenXmlPartReader(OpenXmlPart openXmlPart, bool readMiscNodes, bool ignoreWhitespace) + : this(readMiscNodes) + { + if (openXmlPart is null) { + throw new ArgumentNullException(nameof(openXmlPart)); + } + + _xmlReader = CreateReader(openXmlPart.GetStream(FileMode.Open), true, openXmlPart.MaxCharactersInPart, ignoreWhitespace, out _standalone, out _encoding); } /// @@ -84,7 +100,7 @@ public OpenXmlPartReader(Stream partStream) : this() throw new ArgumentNullException(nameof(partStream)); } - _xmlReader = CreateReader(partStream, false, 0, out _standalone, out _encoding); + _xmlReader = CreateReader(partStream, false, 0, ignoreWhitespace: true, out _standalone, out _encoding); } /// @@ -100,7 +116,23 @@ public OpenXmlPartReader(Stream partStream, bool readMiscNodes) throw new ArgumentNullException(nameof(partStream)); } - _xmlReader = CreateReader(partStream, false, 0, out _standalone, out _encoding); + _xmlReader = CreateReader(partStream, false, 0, ignoreWhitespace: true, out _standalone, out _encoding); + } + + /// + /// Initializes a new instance of the OpenXmlPartReader class using the supplied stream and Boolean values. + /// + /// The part stream of the OpenXmlPart to read. + /// Specify false to indicate to the reader to skip all miscellaneous nodes. + /// Specify true to indicate to the reader to ignore insignificant white space. + public OpenXmlPartReader(Stream partStream, bool readMiscNodes, bool ignoreWhitespace) + : this(readMiscNodes) + { + if (partStream is null) { + throw new ArgumentNullException(nameof(partStream)); + } + + _xmlReader = CreateReader(partStream, false, 0, ignoreWhitespace, out _standalone, out _encoding); } /// @@ -671,13 +703,13 @@ public override void Close() #endif } - private static XmlReader CreateReader(Stream partStream, bool closeInput, long maxCharactersInPart, out bool? _standalone, out string _encoding) + private static XmlReader CreateReader(Stream partStream, bool closeInput, long maxCharactersInPart, bool ignoreWhitespace, out bool? _standalone, out string _encoding) { var settings = new XmlReaderSettings { MaxCharactersInDocument = maxCharactersInPart, CloseInput = closeInput, - IgnoreWhitespace = true, + IgnoreWhitespace = ignoreWhitespace, #if FEATURE_XML_PROHIBIT_DTD ProhibitDtd = true, #else diff --git a/src/DocumentFormat.OpenXml/OpenXmlReader.cs b/src/DocumentFormat.OpenXml/OpenXmlReader.cs index 4ff2ebf75..4c673039a 100644 --- a/src/DocumentFormat.OpenXml/OpenXmlReader.cs +++ b/src/DocumentFormat.OpenXml/OpenXmlReader.cs @@ -52,6 +52,15 @@ protected OpenXmlReader(bool readMiscNodes) /// The newly created OpenXmlReader. public static OpenXmlReader Create(OpenXmlPart openXmlPart, bool readMiscNodes) => new OpenXmlPartReader(openXmlPart, readMiscNodes); + /// + /// Creates an OpenXmlReader from the specified OpenXmlPart and Boolean values. + /// + /// The OpenXmlPart to read. + /// Specify false to indicate to the reader to skip all miscellaneous nodes. The default value is false. + /// Specify true to indicate to the reader to ignore insignificant white space. The default value is true. + /// The newly created OpenXmlReader. + public static OpenXmlReader Create(OpenXmlPart openXmlPart, bool readMiscNodes, bool ignoreWhitespace) => new OpenXmlPartReader(openXmlPart, readMiscNodes, ignoreWhitespace); + /// /// Creates an OpenXmlReader from the specified part stream. /// @@ -67,6 +76,15 @@ protected OpenXmlReader(bool readMiscNodes) /// public static OpenXmlReader Create(Stream partStream, bool readMiscNodes) => new OpenXmlPartReader(partStream, readMiscNodes); + /// + /// Creates an OpenXmlReader from the specified part stream and Boolean values. + /// + /// The part stream. + /// Specify false to indicate to the reader to skip all miscellaneous nodes. The default value is false. + /// Specify true to indicate to the reader to ignore insignificant white space. The default value is true. + /// + public static OpenXmlReader Create(Stream partStream, bool readMiscNodes, bool ignoreWhitespace) => new OpenXmlPartReader(partStream, readMiscNodes, ignoreWhitespace); + /// /// Creates an OpenXmlReader from the OpenXmlElement (travel the DOM tree). /// diff --git a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlReaderTest.cs b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlReaderTest.cs index 637b3015a..e85f68005 100644 --- a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlReaderTest.cs +++ b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlReaderTest.cs @@ -385,6 +385,46 @@ public void PartReaderMiscNodeTest() reader.Close(); } + /// + ///A test for OpenXmlPartReader to test the ignoreWhitespace option + /// + [Theory] + [InlineData(true)] + [InlineData(false)] + public void PartReaderIgnoreWhitespaceTest(bool ignoreWhitespace) + { + const string PartText = "" + + "" + + " " + + "" + + ""; + + UTF8Encoding utf8Encoding = new UTF8Encoding(); + using var stream = new MemoryStream(utf8Encoding.GetBytes(PartText), false); + + using var reader = OpenXmlReader.Create(stream, false, ignoreWhitespace); + Assert.False(reader.EOF); + + reader.Read(); + Assert.False(reader.EOF); + + reader.ReadFirstChild(); + Assert.True(reader.IsStartElement); + Assert.Equal(typeof(Body), reader.ElementType); + reader.Read(); + Assert.True(reader.IsStartElement); + Assert.Equal(typeof(Paragraph), reader.ElementType); + reader.Read(); + Assert.True(reader.IsStartElement); + Assert.Equal(typeof(Run), reader.ElementType); + reader.Read(); + Assert.True(reader.IsStartElement); + Assert.Equal(typeof(Text), reader.ElementType); + Assert.Equal(ignoreWhitespace, reader.GetText() == string.Empty); + + reader.Close(); + } + /// ///A test for OpenXmlPartReader ///