diff --git a/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs b/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs
index 4d3ec8a5a..9a7312433 100644
--- a/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs
+++ b/src/DocumentFormat.OpenXml.Framework/OpenXmlCompositeElement.cs
@@ -3,7 +3,6 @@
using DocumentFormat.OpenXml.Framework;
using System;
-using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
@@ -534,6 +533,32 @@ public override void RemoveAllChildren()
#endregion
+ ///
+ /// Determines whether the specified is a valid child element
+ /// for this according to the schema definition.
+ ///
+ /// The to validate as a child.
+ ///
+ /// true if the specified element is a valid child; otherwise, false.
+ ///
+ public virtual bool IsValidChild(OpenXmlElement element)
+ {
+ if (element is null)
+ {
+ return false;
+ }
+
+ foreach (var elem in Metadata.Children.Elements)
+ {
+ if (elem.Type.Name.Equals(element.Metadata.Type.Name))
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
///
/// Saves all of the current node's children to the specified XmlWriter.
///
diff --git a/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt b/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt
index c7d7da820..abbee3a8e 100644
--- a/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt
+++ b/src/DocumentFormat.OpenXml.Framework/PublicAPI/PublicAPI.Shipped.txt
@@ -1009,3 +1009,4 @@ DocumentFormat.OpenXml.OpenXmlPartWriterSettings.Encoding.set -> void
DocumentFormat.OpenXml.OpenXmlPartWriterSettings.OpenXmlPartWriterSettings() -> void
DocumentFormat.OpenXml.OpenXmlPartWriter.OpenXmlPartWriter(DocumentFormat.OpenXml.Packaging.OpenXmlPart! openXmlPart, DocumentFormat.OpenXml.OpenXmlPartWriterSettings! settings) -> void
DocumentFormat.OpenXml.OpenXmlPartWriter.OpenXmlPartWriter(System.IO.Stream! partStream, DocumentFormat.OpenXml.OpenXmlPartWriterSettings! settings) -> void
+virtual DocumentFormat.OpenXml.OpenXmlCompositeElement.IsValidChild(DocumentFormat.OpenXml.OpenXmlElement! element) -> bool
diff --git a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs
index e2c8caa91..5eb785b1c 100644
--- a/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs
+++ b/test/DocumentFormat.OpenXml.Tests/ofapiTest/OpenXmlElementTest2.cs
@@ -8,7 +8,6 @@
using DocumentFormat.OpenXml.Wordprocessing;
using System;
using System.IO;
-using System.Xml;
using Xunit;
namespace DocumentFormat.OpenXml.Tests
@@ -198,21 +197,6 @@ public void CanSetNullValue()
Assert.Null(cell.Child);
}
- ///
- /// 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);
- }
-
private class WithChildElement : OpenXmlCompositeElement
{
public ChildElement Child
@@ -240,5 +224,61 @@ internal override void ConfigureMetadata(ElementMetadata.Builder builder)
builder.SetSchema(ElementType);
}
}
+
+ ///
+ /// 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);
+ }
+
+ [Fact]
+ public void IsValidChild_ValidChild_ReturnsTrue()
+ {
+ // Arrange
+ Paragraph parentElement = new();
+ Run validChild = new();
+
+ // Act
+ bool result = parentElement.IsValidChild(validChild);
+
+ // Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public void IsValidChild_InvalidChild_ReturnsFalse()
+ {
+ // Arrange
+ Paragraph parentElement = new();
+ Table invalidChild = new();
+
+ // Act
+ bool result = parentElement.IsValidChild(invalidChild);
+
+ // Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void IsValidChild_NullChild_ReturnsFalse()
+ {
+ // Arrange
+ Paragraph parentElement = new();
+
+ // Act
+ bool result = parentElement.IsValidChild(null);
+
+ // Assert
+ Assert.False(result);
+ }
}
}