返回具有最高价值的XML元素

时间:2013-09-23 00:54:08

标签: java xml stax

我正在尝试创建一个找到该元素的Java程序(我是XML的新手,并且不理解行话。它甚至被称为元素?!?),其值最高并返回围绕它的元素。以下是代码示例:

<conversation input="HELLO">
    <output hits="3">
        HI MATE
    </output>
    <output hits="8">
        HELLO
    </output>
</conversation>

它会找到哪个“输出”具有最多“命中”并返回它包含的值(EX.HELLO)。我正在尝试使用stAX,但你知道使用不同的东西做更好的方法,请继续前进!

编辑这是请求的完整代码:

package charles;

import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.swing.JOptionPane;
import javax.xml.stream.*;
import javax.xml.stream.events.*;

public class NewClass {

    //Memory
    static String currentResult = null;
    static int highestHits = 0;
    private static String filename = "\\Files\\Java\\Projects\\CHARLES\\src\\charles\\Memory.xml";
    static XMLEventReader reader;

    public static void main(String args[]) throws XMLStreamException, FileNotFoundException {

        try {
            filename = "\\Files\\Java\\Projects\\CHARLES\\src\\charles\\Memory.xml";
        } catch (ArrayIndexOutOfBoundsException aioobe) {
            System.exit(0);
        }
        try {
            XMLInputFactory factory = XMLInputFactory.newInstance();
            XMLEventReader reader =
                    factory.createXMLEventReader(new FileReader(filename));
            while (reader.hasNext()) {
                XMLEvent e = reader.nextEvent();
                System.out.println("ID:" + e.hashCode() + "[" + e + "]");
            }
        } catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, "The file does not exist!" + "\nProgram is terminating.", "File Not Found", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0);
        }

    }

    private static void analyze() {
        while (reader.hasNext()) {
            int event = (int) reader.next();
            if (event == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals(input)) {
                int currentHits = Integer.parseInt(reader.getAttributeValue(0));
                if (currentHits > highestHits) {
                    highestHits = currentHits;
                    reader.next();
                    currentResult = reader.getText();
                }
            }
        }

    }
}

2 个答案:

答案 0 :(得分:2)

你可以直接使用java XML DOM类来传递所有'output'元素并记录具有最大'hits'属性的元素。假设您已将XML转换为DOM Document对象'doc',然后将其传递给此类方法(如果没有'output'元素或者没有非零命中属性则返回null):

    public String getHighest(Document doc) {   
        NodeList list = doc.getElementsByTagName("output");
        String currentResult = null;
        int highestHit = 0;
        for (int i = 0; i < list.getLength(); i++) {
            int hits = Integer.parseInt(((Element) list.item(i)).getAttribute("hits"));
            if (hits > highestHit) {
                highestHit = hits;
                currentResult = list.item(i).getTextContent();
            }
         }
         return currentResult;
    }

这只适用于XML文档不是很大的情况,因为DOM解析器会在遍历之前将整个XML树加载到内存中。解析的XML树通常占用文件中XML的5到10倍。因此,如果您的XML文件大于几MB,则应使用SAX或StAX解析器。

对于StAX解析此类信息,假设您有一个名为“reader”的XMLStreamReader,那么下面的代码片段就可以工作(尽管您可能应该包含一些错误处理功能):

    int highestHits = 0;
    String currentResult = null;
    while (reader.hasNext()) {
        int event = reader.next();
        if (event == XMLStreamConstants.START_ELEMENT && reader.getLocalName().equals("output")) {
            int currentHits = Integer.parseInt(reader.getAttributeValue(0));
            if (currentHits > highestHits) {
                highestHits = currentHits;
                reader.next();
                currentResult = reader.getText();
            }
        }
    }

编辑重新:更新代码:

我认为问题在于你的代码'reader'是一个XMLEventReader(好吧,它不能编译的原因)。但在“分析”中,您可以在其上调用来自XMLStreamReader的方法。只需确保使用XMLStreamReader在“analyze”方法中执行操作。

答案 1 :(得分:0)

我建议使用DOM和XPATH以简单的方式解决这个问题。

这两个应该提供一些关于如何做到这一点的好主意: How to find the max attribute from an XML document using Xpath 1.0

How to read XML using XPath in Java