【问题标题】:How iterate in XML file by iterator Java?迭代器Java如何在XML文件中迭代?
【发布时间】:2018-09-27 15:14:45
【问题描述】:

我有这个 XML 文件的内容。我需要通过 Java 中的 Iterator 迭代 XML 文件。我不想通过循环或其他方式进行迭代。仅通过迭代器。你能告诉我如何通过迭代器迭代 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;
}
}

【问题讨论】:

    标签: java xml parsing iterator


    【解决方案1】:

    您不应该尝试通过将 XML 读取为文本来处理它,您应该始终使用 XML 解析器。否则,您将依赖 XML 的意外特性,这些特性在未来很容易发生变化,例如,如果发送方决定通过关闭缩进来提高性能。

    您应该通过将其解析为内存中的树结构来处理此文件:要么是旧的笨拙的 DOM,要么是更现代的替代方案之一,例如 JDOM2 或 XOM。

    【讨论】:

    • 完全同意,但不是真正的答案,是吗?
    • 在什么方面不是答案?如果用户以完全错误的方式解决他们的问题,那么告诉他们正确的方式是唯一可接受的回答方式。
    【解决方案2】:

    你的代码有一些问题,主要是这个:

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

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

    因此,if(singleLine.equals("Question")){ 将失败,因为至少您应该寻找 &lt;Question&gt; -> singleLine.ToLower().contains("&lt;question&gt;")。

    话虽如此,您可能想看看this 教程,让您朝着正确的方向开始。

    至于你最后一点,迭代器通常与while 循环一起使用,循环最终变成了迭代器实现。

    【讨论】:

    • 我必须使用迭代器,因为我在学习中得到了这个练习
    猜你喜欢
    • 2015-01-05
    • 2016-04-09
    • 2014-03-25
    • 2015-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 2012-03-23
    • 2010-10-28
    相关资源
    最近更新 更多