0

値が最も高く、それを囲む要素を返す要素 (XML は初めてで、専門用語がわかりません。それは要素と呼ばれますか?!?) を見つける Java プログラムを作成しようとしています。コードの例を次に示します。

<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 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 の場合、「リーダー」と呼ばれる 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 を使用してメソッド「analyze」で操作を実行するようにしてください。

于 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 に答える