From 4e59a376f9fd0c28c99265864399fdf02ae67156 Mon Sep 17 00:00:00 2001 From: Antony Liu Date: Fri, 7 Feb 2025 09:49:39 +0800 Subject: [PATCH] bug #1481, keep all xmlns declarations when parsing CT_Comments tags to avoid losing some --- OpenXmlFormats/Wordprocessing/Markup.cs | 51 +++++++++++++++--- .../ooxml/XWPF/UserModel/TestXWPFComments.cs | 28 ++++++++++ .../test-data/document/NPOI-bug-1481.docx | Bin 0 -> 17582 bytes 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 testcases/test-data/document/NPOI-bug-1481.docx diff --git a/OpenXmlFormats/Wordprocessing/Markup.cs b/OpenXmlFormats/Wordprocessing/Markup.cs index 0fe91cb4c..9fc2b7a3f 100644 --- a/OpenXmlFormats/Wordprocessing/Markup.cs +++ b/OpenXmlFormats/Wordprocessing/Markup.cs @@ -182,15 +182,49 @@ public class CT_Comments private List commentField; + private Dictionary extraXmlNamespace = new Dictionary(); + private Dictionary defaultXmlNamespace = new Dictionary(){ + { "o", "urn:schemas-microsoft-com:office:office" }, + { "ve", "http://schemas.openxmlformats.org/markup-compatibility/2006" }, + { "r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships" }, + { "v", "urn:schemas-microsoft-com:vml" }, + { "m", "http://schemas.openxmlformats.org/officeDocument/2006/math" }, + { "w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main" }, + { "wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" }, + { "w10", "urn:schemas-microsoft-com:office:word" }, + { "w14", "http://schemas.microsoft.com/office/word/2010/wordml" }, + { "wne", "http://schemas.microsoft.com/office/word/2006/wordml" }, + + }; public CT_Comments() { this.commentField = new List(); } + private void FindExtraNamespace(XmlNode node) + { + if (node.Attributes != null) + { + foreach (XmlAttribute attr in node.Attributes) + { + if (attr.Name.StartsWith("xmlns:")) + { + string[] strs = attr.Name.Split(':'); + if (strs.Length == 2) + { + if (!extraXmlNamespace.ContainsKey(strs[1]) && + !defaultXmlNamespace.ContainsKey(strs[1])) + extraXmlNamespace.Add(strs[1], attr.Value); + } + } + } + } + } public static CT_Comments Parse(XmlNode node, XmlNamespaceManager namespaceManager) { if (node == null) return null; CT_Comments ctObj = new CT_Comments(); + ctObj.FindExtraNamespace(node); ctObj.comment = new List(); foreach (XmlNode childNode in node.ChildNodes) { @@ -201,16 +235,21 @@ public static CT_Comments Parse(XmlNode node, XmlNamespaceManager namespaceManag } - + private void WriteXmlNamespace(StreamWriter sw, Dictionary ns) + { + if(ns == null || ns.Count == 0) + return; + foreach (var kv in ns) + { + sw.Write(string.Format($"xmlns:{kv.Key}=\"{kv.Value}\" ", kv.Key, kv.Value)); + } + } internal void Write(StreamWriter sw) { sw.Write(""); sw.Write(string.Format(""); + WriteXmlNamespace(sw, defaultXmlNamespace); + WriteXmlNamespace(sw, extraXmlNamespace); sw.Write(">"); if (this.comment != null) { diff --git a/testcases/ooxml/XWPF/UserModel/TestXWPFComments.cs b/testcases/ooxml/XWPF/UserModel/TestXWPFComments.cs index 7bf13cd5c..7843a13b9 100644 --- a/testcases/ooxml/XWPF/UserModel/TestXWPFComments.cs +++ b/testcases/ooxml/XWPF/UserModel/TestXWPFComments.cs @@ -3,6 +3,8 @@ using NPOI.XWPF.UserModel; using NUnit.Framework; using System.Collections.Generic; + using System.IO; + using System.Reflection.Metadata; [TestFixture] public class TestXWPFComments @@ -56,5 +58,31 @@ public void TestReadComments() Assert.AreEqual(1, allPictures.Count); } } + + [Test] + public void TestNPOIBug1481() + { + using(XWPFDocument doc = XWPFTestDataSamples.OpenSampleDocument("NPOI-bug-1481.docx")) + { + XWPFComment[] comments = doc.GetComments(); + Assert.AreEqual(1, comments.Length); + + XWPFComment comment = comments[0]; + Assert.AreEqual("Claudio Pais", comment.GetAuthor()); + Assert.AreEqual("2025-01-23T17:18:00Z", comment.Date); + Assert.AreEqual("Bla bla", comment.GetText()); + + XWPFDocument docIn = XWPFTestDataSamples.WriteOutAndReadBack(doc); + + comments = docIn.GetComments(); + Assert.AreEqual(1, comments.Length); + + comment = comments[0]; + Assert.AreEqual("Claudio Pais", comment.GetAuthor()); + Assert.AreEqual("2025-01-23T17:18:00Z", comment.Date); + Assert.AreEqual("Bla bla", comment.GetText()); + + } + } } } diff --git a/testcases/test-data/document/NPOI-bug-1481.docx b/testcases/test-data/document/NPOI-bug-1481.docx new file mode 100644 index 0000000000000000000000000000000000000000..1a603d9432fe8cbf244c898a5fc306e27febaec9 GIT binary patch literal 17582 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