У меня есть это содержимое 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;
}
}




В вашем коде есть некоторые проблемы, в основном это:
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, и циклы в конечном итоге превращаются в реализацию итератора.
Никогда не следует пытаться обрабатывать XML, читая его как текст, всегда следует использовать синтаксический анализатор XML. В противном случае вы полагаетесь на случайные особенности XML, которые могут легко измениться в будущем, например, если отправитель решит повысить производительность, отключив отступы.
Вы должны обработать этот файл, преобразовав его в древовидную структуру в памяти: либо старый и неуклюжий DOM, либо одну из более современных альтернатив, таких как JDOM2 или XOM.
Полностью согласен, но не совсем ответ, не так ли?
Чем это не ответ? Если пользователь решает свою проблему совершенно неверным способом, то сказать ему правильный путь - единственный приемлемый способ ответа.
Мне нужно использовать итератор, потому что это упражнение, которое я получил в своем исследовании