docs: def fill_empty(self, fixed_values, input):
          """Fill in random values for all empty-valued ItemData elements in an ODM document"""
          odm_elements = etree.fromstring(input)
  
          for v in odm_elements.iter(E_ODM.ITEM_DATA.value):
              if v.get(A_ODM.VALUE.value) == "":
                  oid = v.get(A_ODM.ITEM_OID.value)
  
                  if fixed_values is not None and oid in fixed_values:
                      d = fixed_values[oid]
                  else:
                      d = self.scramble_itemdata(v.get(A_ODM.ITEM_OID.value), v.get(A_ODM.VALUE.value))
  
                  v.set(A_ODM.VALUE.value, d)
              else:
                  # Remove ItemData if it already has a value
                  v.getparent().remove(v)
  
          # Remove empty ItemGroupData elements
          for v in odm_elements.iter(E_ODM.ITEM_GROUP_DATA.value):
              if len(v) == 0:
                  v.getparent().remove(v)
  
          # Remove empty FormData elements
          for v in odm_elements.iter(E_ODM.FORM_DATA.value):
              if len(v) == 0:
                  v.getparent().remove(v)
  
          # Remove empty StudyEventData elements
          for v in odm_elements.iter(E_ODM.STUDY_EVENT_DATA.value):
              if len(v) == 0:
                  v.getparent().remove(v)
  
          return etree.tostring(odm_elements)