Как выполнить итерацию в XML-файле с помощью итератора Java? - PullRequest
0 голосов
/ 27 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

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

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

0 голосов
/ 27 сентября 2018

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

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, и циклы в конечном итоге превращаются в реализацию итератора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...