3

そのため、5 分ごとに更新される xml ファイルをプルする必要があるプロジェクトがあります。ただし、更新するたびにこのファイルをプルするようにプログラムを設計しています。

xmlファイルのデータ構造はこんな感じ…

<m:REPORT_DATA>
    <m:DATA_ITEM>ENC</m:DATA_ITEM>
    <m:RESOURCE_NAME>DLAP</m:RESOURCE_NAME>
    <m:OPR_DATE>2012-06-02</m:OPR_DATE>
    <m:INTERVAL_NUM>1</m:INTERVAL_NUM>
    <m:VALUE>16.77734</m:VALUE>
</m:REPORT_DATA>
<m:REPORT_DATA>
    <m:DATA_ITEM>ENC</m:DATA_ITEM>
    <m:RESOURCE_NAME>DLAP</m:RESOURCE_NAME>
    <m:DATE>2012-06-02</m:OPR_DATE>
    <m:INTERVAL_NUM>2</m:INTERVAL_NUM>
    <m:VALUE>16.77739</m:VALUE>
</m:REPORT_DATA>
....

その日200回引いたとしたら、最後の値だけをどうやって掴むのでしょうか?

"<m:VALUE>16.77739</m:VALUE>"

そして、私のデータベースのその値を取得しますか?

Sax、Xpath、または DOM の使用について悩んでいます。いくつかの助けは素晴らしいでしょう。

4

5 に答える 5

4

ルートがあった場合、<m:REPORTS>XPath を使用して最後の VALUE を見つけるのはかなり簡単です。

    XPathFactory f = XPathFactory.newInstance() ;
    XPath x = f.newXPath() ;
    try {
        InputSource source = new InputSource(new FileInputStream("logfile.xml")) ;
        XPathExpression expr = x.compile("//REPORT_DATA[DATA_ITEM='ENC'][last()]/VALUE/text()") ;
        String s = expr.evaluate(source) ;
        System.out.println("Last value: " + s ) ;
    }
    catch(Throwable t) {
        System.err.println("Error: " + t) ;
    }
于 2012-07-03T18:56:37.113 に答える
4

これは整形式の xml ではありません。xpath を使用して最後のノードを見つけることができます。たとえば、 //REPORT_DATA[position() = last()] は最後の REPORT_DATA ノードを返します。ジャワ

//REPORT_DATA[last()]/DATA_ITEM[text()="ENC"]

これは、DATA_ITEM が「ENC」に等しいノードを返します。

または //REPORT_DATA[last()]/VALUE[text()="ENC"]

于 2012-07-03T19:01:17.537 に答える
0

SAXを使用します。

xpathまたはDOMのいずれかを使用する場合、特に1回のルックアップでは、低速でメモリコストのかかるDOMを構築する必要があります。

SAXの方が高速ですが、場所と状態を追跡する必要があります。これは、あなたの場合は簡単なはずです。REPORT_DATA要素を探し、カプセル化されたデータを収集するだけで、それが最後のデータ(最後のドキュメントに到達した)である場合は、出力が得られます。

于 2012-07-03T19:04:23.627 に答える
0

これは、ルート要素がない (または複数のルート要素がある) ため、整形式ではないという意味で「XML ファイル」ではありません。そのため、XML ライブラリによって直接ロードすることはできないため、DOM、XPath、または XSLT を使用することはできません。

簡単なパターン マッチングを使用して各セグメントの開始を検出し、最後のセグメントを見つけ、そのセグメントのみを DOM にロードして抽出することをお勧めします。

于 2012-07-03T18:50:02.370 に答える
0
    //filePath the path to the file you want to parse, tag  the tag of the node you want to search.    
public static String getLastNode(String filePath, String tag) throws             ParserConfigurationException, SAXException, IOException{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = docBuilder.parse(filePath);

    return doc.getElementsByTagName(tag).item(doc.getElementsByTagName(tag).getLength()-1).getTextContent();
//if you don't care about specific tag name just use :
//return doc.getLastChild().getTextContent;


}
于 2012-07-03T19:12:31.960 に答える