2015-01-06 1 views
0

이 XML에서 자식 요소를 가져올 수 없습니다. 작업 값을 가져 오는 중이지만 해당 작업에 액세스하여 개별 작업에 사용할 수 없습니다. 내가 reaaly 도움이 필요합니다, 아래에 내가 시도한 soution, 부모 배열 작업 배열을 중첩 할 수 없습니다.중첩 된 XML 끌어 오기 구문 분석기 문제가 자식 요소를 가져올 수 없습니다.

<root> 
    <job> 
     <id>3</id> 
     <job_title/> 
     <job_description/> 
     <job_room>abx.jpg</job_room> 
     <status/> 
     <task>no task</task> 
    </job> 
    <job> 
     <id>2</id> 
     <job_title/> 
     <job_description/> 
     <job_room>ddemo.jpg</job_room> 
     <status/> 
     <task> 
     <task_id/> 
     <task_title/> 
     <task_description/> 
     <task_status>0</task_status> 
     </task> 
    </job> 
    <job> 
     <id>60</id> 
     <job_title>CTO</job_title> 
     <job_description>CTO</job_description> 
     <job_room>4564</job_room> 
     <status>open</status> 
     <task> 
     <task_id>1</task_id> 
     <task_title>Add crib</task_title> 
     <task_description/> 
     <task_status>0</task_status> 
     </task> 
     <task> 
     <task_id>2</task_id> 
     <task_title/> 
     <task_description/> 
     <task_status>0</task_status> 
     </task> 
    </job> 
</root> 

이것은 제가 시도한 해결책입니다.

public static List<Job> parseFeed(String content) { 

     try { 

      boolean inDataItemTag = false; 
      String currentTagName = ""; 
      Job job = null; 
      List<Job> jobList = new ArrayList<>(); 

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      XmlPullParser parser = factory.newPullParser(); 
      parser.setInput(new StringReader(content)); 

      int eventType = parser.getEventType(); 

      while (eventType != XmlPullParser.END_DOCUMENT) { 

       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        currentTagName = parser.getName(); 
        if (currentTagName.equals("job")) { 
         inDataItemTag = true; 
         job = new Job(); 
         jobList.add(job); 
        } 
        break; 

       case XmlPullParser.END_TAG: 
        if (parser.getName().equals("job")) { 
         inDataItemTag = false; 
        } 
        currentTagName = ""; 
        break; 

       case XmlPullParser.TEXT: 
        if (inDataItemTag && job != null) { 
         switch (currentTagName) { 
         case "id": 
          job.setId(parser.getText()); 
          System.out.println(job.getId()); 
          break; 
         case "job_description": 
          job.setJob_description(parser.getText()); 
          System.out.println(job.getJob_description()); 
          break; 
         case "job_room": 
          job.setJob_room(parser.getText()); 
          break; 
         case "job_title": 
          job.setJob_title(parser.getText()); 
          System.out.println("JOB TITLE"); 
          break; 
         case "status" : 
          job.setStatus(parser.getText()); 
          break; 
         case "task" : 
          job.setChildren(getTask(content)); 
         default: 
          break; 
         } 
        } 
        break; 
       } 

       eventType = parser.next(); 

      } 

      return jobList; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 

    } 

    public static List<Task> getTask(String content) { 

     try { 

      boolean inDataItemTag = false; 
      String currentTagName = ""; 
      Task task = null; 
      List<Task> taskList = new ArrayList<>(); 

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      XmlPullParser parser = factory.newPullParser(); 
      parser.setInput(new StringReader(content)); 

      int eventType = parser.getEventType(); 

      while (eventType != XmlPullParser.END_DOCUMENT) { 

       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        currentTagName = parser.getName(); 
        if (currentTagName.equals("task")) { 
         inDataItemTag = true; 
         task = new Task(); 
         taskList.add(task); 
        } 
        break; 

       case XmlPullParser.END_TAG: 
        if (parser.getName().equals("task")) { 
         inDataItemTag = false; 
        } 
        currentTagName = ""; 
        break; 

       case XmlPullParser.TEXT: 
        if (inDataItemTag && task != null) { 
         switch (currentTagName) { 
         case "task_id": 
          task.setTask_id(parser.getText()); 
          System.out.println(task.getTask_id()); 
          break; 
         case "task_description": 
          task.setTask_description(parser.getText()); 
          System.out.println(task.getTask_description()); 
          break; 
         case "task_title": 
          task.setTask_title(parser.getText()); 
          break; 
         case "task_status" : 
          task.setTask_status(parser.getText()); 
          break; 
         default: 
          break; 
         } 
        } 
        break; 
       } 


       if(currentTagName.equals("job")) 
       { 
        break; 
       } 

       eventType = parser.next(); 


      } 

      return taskList; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 

    } 

public class Job { 

    private String id; 
    private String job_title; 
    private String job_description; 
    private String job_room; 
    private String status; 

    private List<Task> children; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public String getJob_title() { 
     return job_title; 
    } 

    public void setJob_title(String job_title) { 
     this.job_title = job_title; 
    } 

    public String getJob_description() { 
     return job_description; 
    } 

    public void setJob_description(String job_description) { 
     this.job_description = job_description; 
    } 

    public String getJob_room() { 
     return job_room; 
    } 

    public void setJob_room(String job_room) { 
     this.job_room = job_room; 
    } 

    public String getStatus() { 
     return status; 
    } 

    public void setStatus(String status) { 
     this.status = status; 
    } 

    public List<Task> getChildren() { 
     return children; 
    } 

    public void setChildren(List<Task> children) { 
     this.children = children; 
    } 
} 

public class Task { 

    private String task_id; 
    private String task_title; 
    private String task_description; 
    private String task_status; 
    public String getTask_id() { 
     return task_id; 
    } 
    public void setTask_id(String task_id) { 
     this.task_id = task_id; 
    } 
    public String getTask_title() { 
     return task_title; 
    } 
    public void setTask_title(String task_title) { 
     this.task_title = task_title; 
    } 
    public String getTask_description() { 
     return task_description; 
    } 
    public void setTask_description(String task_description) { 
     this.task_description = task_description; 
    } 
    public String getTask_status() { 
     return task_status; 
    } 
    public void setTask_status(String task_status) { 
     this.task_status = task_status; 
    } 
} 

답변

0

을 시도 내 개체는 data projection를 사용하여 (모델 포함) 완전한 예는 다음과 같습니다

public class ReadJobs { 

    public interface Projection extends Serializable { 
     interface Job { 
      @XBRead("./task") 
      List<Task> getTasks(); 

      @XBRead("./id") 
      String getID(); 
     } 

     interface Task { 
      @XBRead("./task_id") 
      String getID(); 
     } 

     @XBRead("/root/job") 
     List<Job> getJobs(); 
    } 

    public static void main(String... args) throws IOException { 
     Projection projection = new XBProjector().io().url("res://jobs.xml").read(Projection.class); 
     for (Job job : projection.getJobs()) { 
      System.out.println(job.getID()); 
      for (Task task : job.getTasks()) { 
       System.out.println(task.getID()); 
      } 
     } 
    } 
} 

xml을 수정하면 (닫는 루트 태그 추가)이 프로그램은 다음을 출력합니다.

3 
null 
2 

60 
1 
2 
+0

어떻게하면이 필자를 구현할 수 있습니까? 이 목록을 다른 활동으로 보내고 싶습니다! ? – Hiteshdua1

+1

대답은 제공해야하는 추가 정보에 따라 달라지기 때문에 이는 매우 다른 주제입니다. [이 튜토리얼] (http://developer.android.com/reference/android/os/Parcelable.html)을 따르는 것이 가능해야합니다. 그러나 또 다른 해결책이 있습니다 : 투영법은'Serializeable'을 확장 할 수 있습니다. [여기] (https://encrypted.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CDoQFjAE&url=http%3A%2F%2Fwww.developerphil.com%2Fparcelable-vs-serializable보기 % 2F & ei = 2Lq4VKqGHcrcPfnAgOAD & usg = AFQjCNGRpohXPz5HhXIQ3xxcMLUNGQ1tZw & sig2 = PviF-wpMrRVZ-UOqu3IWNQ & bvm = bv.83829542, d.ZWU) – Cfx

0
나는이 작업을 위해 JAXB를 사용하도록 제안 할 수

, 다음이

public class Test { 
    @XmlElement 
    List<Job> job; 

    public static void main(String[] args) throws Exception { 
     List<Job> jobs = JAXB.unmarshal(new File("1.xml"), Test.class).job; 
    } 
}