首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代器Java如何在XML文件中迭代?

迭代器Java如何在XML文件中迭代?
EN

Stack Overflow用户
提问于 2018-09-27 15:14:45
回答 2查看 760关注 0票数 1

我有这个XML文件的内容。我需要在Java中迭代Iterator的XML文件。我不想通过循环或其他方式迭代。只有爱尔兰人。你能告诉我如何用迭代器迭代XML文件吗?我可以读取XML文件,例如文本文件,或者必须通过DOM解析文件吗?

XML文件

代码语言:javascript
复制
 <?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>

这是我写的代码。

代码语言:javascript
复制
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;
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-27 15:48:33

永远不要试图以文本的形式读取XML,而应该始终使用XML解析器。否则,您将依赖XML的意外特性,这些特性可能在将来很容易更改,例如,如果发送方决定通过关闭缩进来提高性能。

您应该通过将文件解析为内存中的树结构来处理该文件:旧的和笨拙的DOM,或者更现代的选项之一,如JDOM2或XOM。

票数 1
EN

Stack Overflow用户

发布于 2018-09-27 15:26:10

您的代码存在一些问题,主要如下:

代码语言:javascript
复制
while ((line = br.readLine()) != null) {
     String[] splittedTextXMLFile = line.split("\n");

br.readLine(),会给你一行文字。不管结果如何,将其除以新的行分母:\n不会有任何区别,因此,splittedTextXMLfile将只包含一个元素,即line

其结果是:if(singleLine.equals("Question")){将失败,因为至少您应该寻找<Question> -> singleLine.ToLower().contains("<question>")

尽管如此,您可能需要查看教程,以使您从正确的方向开始。

至于最后一点,迭代器通常与while循环一起使用,循环最终转化为迭代器实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52540203

复制
相关文章

相似问题

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