diff --git a/IO/XML/vtkXMLHyperTreeGridReader.cxx b/IO/XML/vtkXMLHyperTreeGridReader.cxx
index b88a5ad4da0a568cd4a44e9fca1eb05abd55952e..e3442e432102935a21c0ebe4e39f4f7204b9ad10 100644
--- a/IO/XML/vtkXMLHyperTreeGridReader.cxx
+++ b/IO/XML/vtkXMLHyperTreeGridReader.cxx
@@ -1039,7 +1039,7 @@ void vtkXMLHyperTreeGridReader::ReadTrees_2(vtkXMLDataElement* element)
 
     for (std::size_t arrayId = 0; arrayId < arrays.size(); ++arrayId)
     {
-      if (!this->ReadArrayValues(
+      if (!this->ReadArrayTuples(
             arrayElements[arrayId], outputOffset, arrays[arrayId], inputOffset, readableTreeSize))
       {
         vtkErrorMacro(<< "Failed reading array " << arrayId << ". Aborting.");
diff --git a/IO/XML/vtkXMLReader.cxx b/IO/XML/vtkXMLReader.cxx
index 725a7c29f809008b9701c851a21835f84a47220c..096bc909786676bbfc634571d51d5818c5e9ab33 100644
--- a/IO/XML/vtkXMLReader.cxx
+++ b/IO/XML/vtkXMLReader.cxx
@@ -947,6 +947,17 @@ int vtkXMLReader::ReadArrayValues(vtkXMLDataElement* da, vtkIdType arrayIndex,
   return result;
 }
 
+//------------------------------------------------------------------------------
+int vtkXMLReader::ReadArrayTuples(vtkXMLDataElement* da, vtkIdType arrayTupleIndex,
+  vtkAbstractArray* array, vtkIdType startTupleIndex, vtkIdType numTuples, FieldType fieldType)
+{
+  assert(array != nullptr);
+
+  int noc = array->GetNumberOfComponents();
+  return this->ReadArrayValues(
+    da, noc * arrayTupleIndex, array, noc * startTupleIndex, noc * numTuples, fieldType);
+}
+
 //------------------------------------------------------------------------------
 void vtkXMLReader::ReadXMLData()
 {
diff --git a/IO/XML/vtkXMLReader.h b/IO/XML/vtkXMLReader.h
index 31f425dbb96e260a8943955807847928ab0c56c5..3f0bd69d258bdeda75d31bfd52794ad141afd835 100644
--- a/IO/XML/vtkXMLReader.h
+++ b/IO/XML/vtkXMLReader.h
@@ -299,6 +299,16 @@ protected:
   virtual int ReadArrayValues(vtkXMLDataElement* da, vtkIdType arrayIndex, vtkAbstractArray* array,
     vtkIdType startIndex, vtkIdType numValues, FieldType type = OTHER);
 
+  // Read an Array values starting at the given tuple index and up to numTuples
+  // taking into account the number of components declared in array.
+  // This method assumes that the array is of correct size to
+  // accommodate all numTuples multiplied by number of components.
+  // arrayTupleIndex is the tuple index at which the read
+  // values will be put in the array.
+  virtual int ReadArrayTuples(vtkXMLDataElement* da, vtkIdType arrayTupleIndex,
+    vtkAbstractArray* array, vtkIdType startTupleIndex, vtkIdType numTuples,
+    FieldType type = OTHER);
+
   // Setup the data array selections for the input's set of arrays.
   void SetDataArraySelections(vtkXMLDataElement* eDSA, vtkDataArraySelection* sel);