0

XStreamを使用して大きなXMLファイル(〜1 GB)をインポートしようとしています。を使用してストリーミングを読み取りたいのですがObjectInputStream、最初の要素をスキップしてからいくつかの要素を下に移動する必要があります(以下を参照してくださいbag_LVC:Woonplaats。要素をインポートする必要があります)。

私の興味のある要素まで探求されてきたxstreamaReaderまたはaをフィードする方法があると思います。InputStream自分で作成HierarchicalStreamReaderして正しい要素に移動しようとしましたが、上下にしか移動できません。

HierarchicalStreamReader xpp = new XppDriver().createReader(xmlFile);
xpp.moveDown(); // moves to <xb:antwoord>
xpp.move(); // **would move to <xb:producten>, but it private**
xpp.moveDown(); // moves to <xb:producten>
xpp.moveDown(); // moves to <product_LVC:LVC-product>
st = xstream.createObjectInputStream(xpp);
BagWoonplaats bw = (BagWoonplaats) st.readObject();

xstreamまたはいずれかのXPPドライバーには、興味のある要素を探す方法がありますか?

xml

<xb:BAG-Extract-Deelbestand-LVC>
  <xb:antwoord>
    <xb:vraag>
    <!-- more elements here -->
    </xb:vraag>
    <xb:producten>
      <product_LVC:LVC-product>
        <bag_LVC:Woonplaats>
          <!-- elements used as fields -->
        </bag_LVC:Woonplaats>
        <bag_LVC:Woonplaats>
          <!-- elements used as fields -->
        </bag_LVC:Woonplaats>
        <!-- and so on -->
4

1 に答える 1

0

この問題の解決策は実際には非常に些細なことであり、私はほとんど恥ずかしい思いをしていますが、とにかくこの問題の答えを共有しましょう。HierarchicalStreamReaderのAPIを取得できませんでした。XStreamのコードを調べた後、なんとか処理できました。これがどのように機能するかです。

    HierarchicalStreamReader xpp = ...;
    while(xpp.hasMoreChildren()) {
        xpp.moveDown();
        // do something with the child element, and recursive into this again if appropriate
        xpp.moveUp();
    }

これは、適切な要素を探すために現在使用している再帰的な方法です。場所は、事前に正規化した一種のxpath式(もちろん非常に基本的なもの)によって、ArrayListに指定されます。

private void seekToElement(HierarchicalStreamReader xpp, ArrayList<String> xpathishArray) {
    while(xpp.hasMoreChildren()) {
        xpp.moveDown();
        if(xpp.getNodeName().equals(xpathishArray.get(0))) {
            if(xpathishArray.size() > 1) {
                xpathishArray.remove(0);
                seekToElement(xpp, xpathishArray);
            }
            return;
        }
        xpp.moveUp();
    }
}
于 2012-02-18T17:00:59.447 に答える