code: private void readPredecessors(net.sf.mpxj.planner.schema.Task plannerTask)
     {
        Task mpxjTask = m_projectFile.getTaskByUniqueID(getInteger(plannerTask.getId()));
  
        Predecessors predecessors = plannerTask.getPredecessors();
        if (predecessors != null)
        {
           List<Predecessor> predecessorList = predecessors.getPredecessor();
           for (Predecessor predecessor : predecessorList)
           {
              Integer predecessorID = getInteger(predecessor.getPredecessorId());
              Task predecessorTask = m_projectFile.getTaskByUniqueID(predecessorID);
              if (predecessorTask != null)
              {
                 Duration lag = getDuration(predecessor.getLag());
                 if (lag == null)
                 {
                    lag = Duration.getInstance(0, TimeUnit.HOURS);
                 }
                 Relation relation = mpxjTask.addPredecessor(predecessorTask, RELATIONSHIP_TYPES.get(predecessor.getType()), lag);
                 m_eventManager.fireRelationReadEvent(relation);
              }
           }
        }
  
        //
        // Process child tasks
        //
        List<net.sf.mpxj.planner.schema.Task> childTasks = plannerTask.getTask();
        for (net.sf.mpxj.planner.schema.Task childTask : childTasks)
        {
           readPredecessors(childTask);
        }
     }
docs: This method extracts predecessor data from a Planner file.
  
  @param plannerTask Task data