0

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

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

它将找出哪个“输出”具有最多的“命中”并返回它包含的值(例如 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();
                }
            }
        }

    }
}
4

2 回答 2

2

您可以通过传递所有“输出”元素并记录具有最大“命中”属性的 Java XML DOM 类来直接执行此操作。假设您已将 XML 转换为 DOM 文档对象“doc”,然后将其传递给这样的方法(如果没有“输出”元素或没有非零命中属性,则返回 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 树通常会比文件中的 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();
            }
        }
    }

编辑重新:更新的代码:

我认为问题在于您的代码中的“阅读器”是一个 XMLEventReader(嗯,它无法编译的原因)。但在“分析”中,您调用来自 XMLStreamReader 的方法。只需确保您使用 XMLStreamReader 来执行“分析”方法中的操作。

于 2013-09-23T04:48:51.593 回答
0

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

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

如何在 Java 中使用 XPath 读取 XML

于 2013-09-23T12:41:20.783 回答