首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StAX和arraylist java

StAX和arraylist java
EN

Stack Overflow用户
提问于 2016-10-21 16:03:22
回答 2查看 91关注 0票数 2

我试图用StAX读取一个xml文档,但是我有一个小问题,我不知道如何修复它,我尝试在互联网上查找(也许我用错了我的问题的关键词:/),所以我有这个XML:

代码语言:javascript
复制
<questionReponses
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://polytis.fr/studentest'
xsi:schemaLocation='http://polytis.fr/studentest qanda.xsd'>
<questionReponse>
    <categorie>Biologie</categorie>
    <question>Question 1</question>
    <reponse>reponse correcte 1</reponse>
    <mauvaiseReponse>reponse fausse 1.1</mauvaiseReponse>
    <mauvaiseReponse>reponse fausse 1.2</mauvaiseReponse>
    <mauvaiseReponse>reponse fausse 1.3</mauvaiseReponse>
</questionReponse>
<questionReponse>
    <categorie>Chimie</categorie>
    <question>Question 2</question>
    <reponse>reponse correcte 2</reponse>
    <mauvaiseReponse>reponse fausse 2.1</mauvaiseReponse>
    <mauvaiseReponse>reponse fausse 2.2</mauvaiseReponse>
    <mauvaiseReponse>reponse fausse 2.3</mauvaiseReponse>
</questionReponse>
<questionReponse>
    <categorie>CultureG</categorie>
    <question>Question 3</question>
    <reponse>reponse correcte 3</reponse>
    <mauvaiseReponse>reponse fausse 3.1</mauvaiseReponse>
    <mauvaiseReponse>reponse fausse 3.2</mauvaiseReponse>
    <mauvaiseReponse>reponse fausse 3.3</mauvaiseReponse>
</questionReponse>

下面是我的解析器:

代码语言:javascript
复制
try {
        // instanciation du parser
        InputStream in = new FileInputStream(nomFichier);
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader parser = factory.createXMLStreamReader(in);

        // lecture des evenements
        for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {
            // traitement selon l'evenement
            switch (event) {
                case XMLStreamConstants.START_ELEMENT:
                    break;
                case XMLStreamConstants.END_ELEMENT:
                    if (parser.getLocalName().equals("questionReponse")) {
                        question = new Question(categorieCourante,questionCourante,bonneReponseCourante,mauvaisesReponses);
                        quizz.add(question);
                    }               
                    if (parser.getLocalName().equals("categorie")) {
                        categorieCourante = donneesCourantes;
                    }
                    if (parser.getLocalName().equals("question")) {
                        questionCourante = donneesCourantes;
                    }
                    if (parser.getLocalName().equals("reponse")) {
                        bonneReponseCourante = donneesCourantes;
                    }
                    if (parser.getLocalName().equals("mauvaiseReponse")) {
                        mauvaisesReponses.add(donneesCourantes);
                    }
                    break;
                case XMLStreamConstants.CHARACTERS:
                    donneesCourantes = parser.getText();
                    break;
            } // end switch
        } // end for
        parser.close();
    }

结果并不是预期的那样:

代码语言:javascript
复制
question 1
[categorie = 
Biologie
question = 
Question 1
bonne reponse = 
reponse correcte 1
mauvaises reponse = 
reponse fausse 1.1
reponse fausse 1.2
reponse fausse 1.3
reponse fausse 2.1
reponse fausse 2.2
reponse fausse 2.3
reponse fausse 3.1
reponse fausse 3.2
reponse fausse 3.3


, categorie = 
Chimie
question = 
Question 2
bonne reponse = 
reponse correcte 2
mauvaises reponse = 
reponse fausse 1.1
reponse fausse 1.2
reponse fausse 1.3
reponse fausse 2.1
reponse fausse 2.2
reponse fausse 2.3
reponse fausse 3.1
reponse fausse 3.2
reponse fausse 3.3


, categorie = 
CultureG
question = 
Question 3
bonne reponse = 
reponse correcte 3
mauvaises reponse = 
reponse fausse 1.1
reponse fausse 1.2
reponse fausse 1.3
reponse fausse 2.1
reponse fausse 2.2
reponse fausse 2.3
reponse fausse 3.1
reponse fausse 3.2
reponse fausse 3.3


]

我的三个问题也是一样的。当我解析"mauvaiseReponse“时,所有的"mauvaiseReponse”包都是流和添加的。

我正在寻找的结果是这样的:

代码语言:javascript
复制
question 1
categorie = 
Biologie
question = 
Question 1
bonne reponse = 
reponse correcte 1
mauvaises reponse = 
reponse fausse 1.1
reponse fausse 1.2
reponse fausse 1.3

对不起,如果我的英语不是那么好,我希望你能解决我的问题,并能帮助我解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-21 16:43:36

解释

简单地说,您必须在每个已完成的问题实例上更新您的badAnswers 列表。

我已经为提供的输入xml文件编写了一个示例代码。为了简单起见,我用解决方案在同一个文件中创建了问题类;

代码语言:javascript
复制
    // A - first instantiation of badAnswers list
    List<String> badAnswers = new LinkedList<>();
    for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {

        switch (event) {
            case XMLStreamConstants.START_ELEMENT:
                break;

            case XMLStreamConstants.END_ELEMENT:
                if (parser.getLocalName().equals("questionReponse")) {
                    Question question = new Question(currentCategory, currentQuestion, currentRightAnswer, badAnswers);
                    quiz.add(question);
                    // B - Renew badAnswers after each Question entry insert
                    badAnswers = new LinkedList<>();    
                }   

还请注意,我在这里使用了LinkedList实现来演示您的问题与列表实现无关,它与实现无关。

解码

代码语言:javascript
复制
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

public class Solution {

    public static void main(String[] args)  {
        List<Question> quiz = getQuiz("inputFile.xml");

        printQuiz(quiz);
    }

    public static List<Question> getQuiz(String fileName) {
        List<Question> quiz = null;

        try {
            // parser instantiation
            InputStream in = new FileInputStream(fileName);
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLStreamReader parser = factory.createXMLStreamReader(in);

            String currentData = null, currentCategory = null, currentQuestion = null, currentRightAnswer = null;
            quiz = new LinkedList<>();
            List<String> badAnswers = new LinkedList<>();   // first instantiation of badAnswers list
            for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) {

                switch (event) {
                    case XMLStreamConstants.START_ELEMENT:
                        break;

                    case XMLStreamConstants.END_ELEMENT:
                        if (parser.getLocalName().equals("questionReponse")) {
                            Question question = new Question(currentCategory, currentQuestion, currentRightAnswer, badAnswers);
                            quiz.add(question);
                            badAnswers = new LinkedList<>();    // Renew badAnswers after each Question entry insert
                        }               
                        if (parser.getLocalName().equals("categorie")) {
                            currentCategory = currentData;
                        }
                        if (parser.getLocalName().equals("question")) {
                            currentQuestion = currentData;
                        }
                        if (parser.getLocalName().equals("reponse")) {
                            currentRightAnswer = currentData;
                        }
                        if (parser.getLocalName().equals("mauvaiseReponse")) {
                            badAnswers.add(currentData);
                        }
                        break;

                    case XMLStreamConstants.CHARACTERS:
                        currentData = parser.getText();
                        break;
                }
            }   // end of for loop
            parser.close();

        } catch (FileNotFoundException | XMLStreamException e) {
            e.printStackTrace();
        }

        return quiz;
    }

    public static void printQuiz(List<Question> quiz) {
        int i = 1;
        for(Question q : quiz) {
            System.out.println("Question    : " + i++);
            System.out.printf("\tCategory   : %s\n" , q.getCurrentCategory());
            System.out.printf("\tQuestion   : %s\n" , q.getCurrentQuestion());
            System.out.printf("\tAnswer     : %s\n" , q.getCurrentRightAnswer());
            System.out.printf("\tBad Answers: %s\n" , q.getBadAnswers());
            System.out.println("***********************\n");
        }
    }

}

class Question {

    private String currentCategory;
    private String currentQuestion;
    private String currentRightAnswer;
    private List<String> badAnswers;

    public Question(String currentCategory, String currentQuestion, String currentRightAnswer, List<String> badAnswers) {
        this.currentCategory = currentCategory;
        this.currentQuestion = currentQuestion;
        this.currentRightAnswer = currentRightAnswer;
        this.badAnswers = badAnswers;
    }

    public String getCurrentCategory() {
        return currentCategory;
    }

    public String getCurrentQuestion() {
        return currentQuestion;
    }

    public String getCurrentRightAnswer() {
        return currentRightAnswer;
    }

    public List<String> getBadAnswers() {
        return badAnswers;
    }

}

演示输出

代码语言:javascript
复制
Question    : 1
    Category   : Biologie
    Question   : Question 1
    Answer     : reponse correcte 1
    Bad Answers: [reponse fausse 1.1, reponse fausse 1.2, reponse fausse 1.3]
***********************

Question    : 2
    Category   : Chimie
    Question   : Question 2
    Answer     : reponse correcte 2
    Bad Answers: [reponse fausse 2.1, reponse fausse 2.2, reponse fausse 2.3]
***********************

Question    : 3
    Category   : CultureG
    Question   : Question 3
    Answer     : reponse correcte 3
    Bad Answers: [reponse fausse 3.1, reponse fausse 3.2, reponse fausse 3.3]
***********************
票数 0
EN

Stack Overflow用户

发布于 2016-10-21 16:13:42

之所以会发生这种情况,是因为您的所有问题都有相同的mauvaisesReponses列表实例。

您应该在将新实例mauvaisesReponses添加到问题new Question(categorieCourante,questionCourante,bonneReponseCourante,mauvaisesReponses)之后创建它。

代码语言:javascript
复制
question = new Question(categorieCourante,questionCourante,bonneReponseCourante,mauvaisesReponses);
quizz.add(question);
mauvaisesReponses = new ArrayList<>(); //Or what data structure you use for it.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40181063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档