diff --git a/include/libcamera/internal/value_node.h b/include/libcamera/internal/value_node.h
index 14c5e0eb0202..4e3757af7d09 100644
--- a/include/libcamera/internal/value_node.h
+++ b/include/libcamera/internal/value_node.h
@@ -244,6 +244,9 @@ public:
 	ValueNode *add(std::initializer_list<std::string_view> path,
 		       std::unique_ptr<ValueNode> &&child);
 
+	void erase(const std::string &key);
+	void erase(std::initializer_list<std::string_view> path);
+
 private:
 	LIBCAMERA_DISABLE_COPY_AND_MOVE(ValueNode)
 
diff --git a/src/libcamera/value_node.cpp b/src/libcamera/value_node.cpp
index 990e46d70358..8a1af13a5d6e 100644
--- a/src/libcamera/value_node.cpp
+++ b/src/libcamera/value_node.cpp
@@ -621,4 +621,55 @@ ValueNode *ValueNode::add(std::initializer_list<std::string_view> path,
 	return node;
 }
 
+/**
+ * \brief Erase a child node in a dictionary
+ * \param[in] key The dictionary key
+ *
+ * Erase the child node referenced by \a key in a dictionary node. If the \a
+ * key does not exist, or if this node is not a dictionary, the function
+ * returns without performing any operation.
+ */
+void ValueNode::erase(const std::string &key)
+{
+	auto node = dictionary_.extract(key);
+	if (node.empty())
+		return;
+
+	for (auto iter = list_.begin(); iter != list_.end(); ++iter) {
+		if (iter->value.get() != node.mapped())
+			continue;
+
+		list_.erase(iter);
+		return;
+	}
+}
+
+/**
+ * \brief Erase the child node at the given path
+ * \param[in] path The path
+ *
+ * Erase the child node at the given \a path. If no child node exists for the
+ * path, the function returns without performing any operation.
+ */
+void ValueNode::erase(std::initializer_list<std::string_view> path)
+{
+	if (!path.size())
+		return;
+
+	ValueNode *node = this;
+
+	for (const auto [i, name] : utils::enumerate(path)) {
+		if (i == path.size() - 1) {
+			node->erase(std::string{ name });
+			return;
+		}
+
+		auto iter = node->dictionary_.find(name);
+		if (iter == node->dictionary_.end())
+			return;
+
+		node = iter->second;
+	}
+}
+
 } /* namespace libcamera */
