From 15842054018101b295ef965d04d3fe238df5d286 Mon Sep 17 00:00:00 2001 From: Michael Bowen <10384982+mikeebowen@users.noreply.github.com> Date: Thu, 23 Jan 2025 13:35:55 -0800 Subject: [PATCH 1/3] add GetOrAddFirstChild method --- .../OpenXmlElement.cs | 21 ++++++++++++++++++- .../PublicAPI/PublicAPI.Shipped.txt | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs b/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs index 969db9c0d..90bc5b28e 100644 --- a/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs +++ b/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs @@ -796,11 +796,30 @@ public void RemoveNamespaceDeclaration(string prefix) /// Finds the first child element in type T. /// /// Type of element. - /// + /// The first child element of type T or null public T? GetFirstChild() where T : OpenXmlElement => ChildElements.First(); + /// + /// Finds the first child element of type T or adds a new element if it does not exist. + /// + /// Type of element. + /// The new or existing OpenXmlElement + public T GetOrAddFirstChild() + where T : OpenXmlElement, new() + { + var child = GetFirstChild(); + + if (child is null) + { + child = new T(); + AppendChild(child); + } + + return child; + } + /// /// Gets the OpenXmlElement element that immediately precedes the current OpenXmlElement element. /// Returns null (Nothing in Visual Basic ) if there is no preceding OpenXmlElement element. diff --git a/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt b/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt index 3a8794d0b..cf8ffece3 100644 --- a/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt +++ b/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt @@ -270,6 +270,7 @@ DocumentFormat.OpenXml.OpenXmlElement.Features.get -> DocumentFormat.OpenXml.Fea DocumentFormat.OpenXml.OpenXmlElement.GetAttribute(string! localName, string! namespaceUri) -> DocumentFormat.OpenXml.OpenXmlAttribute DocumentFormat.OpenXml.OpenXmlElement.GetAttributes() -> System.Collections.Generic.IList! DocumentFormat.OpenXml.OpenXmlElement.GetFirstChild() -> T? +DocumentFormat.OpenXml.OpenXmlElement.GetOrAddFirstChild() -> T! DocumentFormat.OpenXml.OpenXmlElement.HasAttributes.get -> bool DocumentFormat.OpenXml.OpenXmlElement.InsertAfterSelf(T! newElement) -> T! DocumentFormat.OpenXml.OpenXmlElement.InsertBeforeSelf(T! newElement) -> T! From 9885cde3663c396d8bc61b714a518779ec8cd048 Mon Sep 17 00:00:00 2001 From: Michael Bowen <10384982+mikeebowen@users.noreply.github.com> Date: Thu, 20 Mar 2025 15:09:31 -0700 Subject: [PATCH 2/3] add test for GetOrAddFirstChild --- .../ofapiTest/OpenXmlElementTest2.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs index aab185f0d..98cd4fe18 100644 --- a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs +++ b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs @@ -216,5 +216,20 @@ internal override void ConfigureMetadata(ElementMetadata.Builder builder) private class ChildElement : OpenXmlLeafElement { } + + /// + /// A test for OpenXmlElement.GetOrAddFirstChild. + /// + [Fact] + public void GetOrAddFirstChildTest() + { + Paragraph p = new(); + Run r = p.GetOrAddFirstChild(); + Assert.NotNull(r); + Assert.Same(r, p.GetFirstChild()); + + var r2 = p.GetOrAddFirstChild(); + Assert.Same(r, r2); + } } } From 83a4d82cf5bbfb018cbd2aa22d2e0569006c7ec3 Mon Sep 17 00:00:00 2001 From: Michael Bowen <10384982+mikeebowen@users.noreply.github.com> Date: Mon, 24 Mar 2025 09:08:03 -0700 Subject: [PATCH 3/3] Update src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs Co-authored-by: Taylor Southwick --- src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs b/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs index 90bc5b28e..9031b05de 100644 --- a/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs +++ b/src/DocumentFormat.OpenXml.Framework/OpenXmlElement.cs @@ -802,7 +802,7 @@ public void RemoveNamespaceDeclaration(string prefix) => ChildElements.First(); /// - /// Finds the first child element of type T or adds a new element if it does not exist. + /// Finds the first child element of or adds a new element if it does not exist. /// /// Type of element. /// The new or existing OpenXmlElement