Как выполнить итерацию в XML-файле с помощью итератора Java?

У меня есть это содержимое XML-файла. Мне нужно выполнить итерацию в XML-файле с помощью Iterator в Java. Я не хочу повторять цикл или что-то еще. Только Итератором. Вы можете показать мне, как выполнять итерацию файла XML с помощью итератора? Могу ли я прочитать XML-файл, такой как текстовый файл, или мне нужно проанализировать файл с помощью DOM?

XML файл

 <?xml version = "1.0" encoding = "utf-8"?>
<Rules>

<Rule id = "damaged">
    <Question>Do you want to accidents car?</Question>
    <Answer>
        <Selection value = "true">
            <SingleValue value = "yes"/>
        </Selection>
        <Selection value = "false">
            <SingleValue value = "no"/>
        </Selection>
    </Answer>
</Rule>

<Rule id = "family">
    <Question>Do you want to family car?</Question>
    <Answer>
        <Selection value = "true">
            <MultipleValue value = "yes"/>
        </Selection>
        <Selection value = "false">
            <MultipleValue value = "no"/>
        </Selection>
    </Answer>
</Rule>

<Rule id = "money">
    <Question>Do you have 200.000 PLN for a car?</Question>
    <Answer>
        <Selection value = "true">
            <SingleValue value = "yes"/>
        </Selection>
        <Selection value = "false">
            <SingleValue value = "no"/>
        </Selection>
    </Answer>
</Rule>

<Rule id = "drivingGear">
    <Question>Do you have front-wheel drive?</Question>
    <Answer>
        <Selection value = "true">
            <MultipleValue value = "on the front wheels"/>
        </Selection>
        <Selection value = "false">
            <MultipleValue value = "on the rear wheels"/>
        </Selection>
    </Answer>
</Rule>

<Rule id = "gearBox">
    <Question>Do you want to automatic gearbox?</Question>
    <Answer>
        <Selection value = "true">
            <SingleValue value = "automatic"/>
        </Selection>
        <Selection value = "false">
            <SingleValue value = "manual"/>
        </Selection>
    </Answer>
</Rule>


<Rule id = "comfort">
    <Question>What is more important for you?</Question>
    <Answer>
        <Selection value = "true">
            <SingleValue value = "comfort"/>
        </Selection>
        <Selection value = "false">
            <SingleValue value = "speed"/>
        </Selection>
    </Answer>
</Rule>
...
<Rule id = "luxury">
    <Question>What feature is must-have for you?</Question>
    <Answer>
        <Selection value = "true">
            <MultipleValue value = "gps,bluetooth,dvd,automatic transmission,self-driving"/>
        </Selection>
        <Selection value = "false">
            <MultipleValue value = "nothing,abs,fog lights,central lock"/>
        </Selection>
    </Answer>
</Rule>

А вот и написанный мной код ..

public class Question{

private List<String> splittedXML;

public Question(){
    this.splittedXML = new ArrayList<>();
}

public List<String> getSplittedXML(){
    return this.splittedXML;
}

public Iterator<String> QuestionIterator(){
    try (BufferedReader br = new BufferedReader(new FileReader("/home/hubert/Pulpit/expert-system-hubert/Rules.xml"))) {

        String line;

        while ((line = br.readLine()) != null) {
            String[] splittedTextXMLFile = line.split("\n");


            for(String singleLine: splittedTextXMLFile){
                if (singleLine.equals("Question")){
                    splittedXML.add(singleLine.substring(singleLine.indexOf(">") + 1, singleLine.indexOf("<")));
                }
            }

        }
        Iterator<String> itr = splittedXML.iterator();

        while(itr.hasNext()){
            return itr;
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
613
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В вашем коде есть некоторые проблемы, в основном это:

while ((line = br.readLine()) != null) {
     String[] splittedTextXMLFile = line.split("\n");

br.readLine() выдаст вам одну строку текста. Каким бы ни был результат, разделение его на новый знаменатель строки: \n не будет иметь никакого значения, таким образом, splittedTextXMLfile будет содержать только 1 элемент, то есть line.

В результате это: if (singleLine.equals("Question")){ выйдет из строя, поскольку, по крайней мере, вы должны искать <Question> -> singleLine.ToLower().contains("<question>").

При этом вы можете посмотреть учебник это, чтобы начать в правильном направлении.

Что касается вашего последнего пункта, итератор обычно используется с циклом while, и циклы в конечном итоге превращаются в реализацию итератора.

Мне нужно использовать итератор, потому что это упражнение, которое я получил в своем исследовании

Hubert95 27.09.2018 17:36
Ответ принят как подходящий

Никогда не следует пытаться обрабатывать XML, читая его как текст, всегда следует использовать синтаксический анализатор XML. В противном случае вы полагаетесь на случайные особенности XML, которые могут легко измениться в будущем, например, если отправитель решит повысить производительность, отключив отступы.

Вы должны обработать этот файл, преобразовав его в древовидную структуру в памяти: либо старый и неуклюжий DOM, либо одну из более современных альтернатив, таких как JDOM2 или XOM.

Полностью согласен, но не совсем ответ, не так ли?

Robert 27.09.2018 17:51

Чем это не ответ? Если пользователь решает свою проблему совершенно неверным способом, то сказать ему правильный путь - единственный приемлемый способ ответа.

Michael Kay 27.09.2018 17:59

Другие вопросы по теме