【问题标题】:Nested XML pull parser issue ,cannot get child elements嵌套 XML 拉解析器问题,无法获取子元素
【发布时间】:2015-03-04 00:21:51
【问题描述】:

我无法从此 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;
    }
}

【问题讨论】:

    标签: java android xml xml-parsing xmlpullparser


    【解决方案1】:

    这是一个使用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
    

    【讨论】:

    • 我怎样才能在这个实现parcelable。?我想将此列表发送到另一个活动! ?
    • 这是另一个话题,因为答案取决于您需要提供的更多信息。应该可以关注this tutorial。但还有另一种解决方案:投影可以扩展Serializeable。见here
    【解决方案2】:

    我可以建议使用 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多