2

だから、私は次のようなファイルを持っています

<root>
  <transaction ts="1">
    <abc><def></def></abc>
  </transaction>
  <transaction ts="2">
    <abc><def></def></abc>
  </transaction>
</root>

したがって、ts="2" の場合に何かを行うという条件があります...問題は、ts="1" が検出されたときに、タグ < abc>< def> をスキャンし、< transaction ts= に到達することです。 "2">

条件が解析ブレークに一致しない場合に、次のトランザクション タグを直接探す方法はありますか?

4

4 に答える 4

0

条件が解析ブレークに一致しない場合に、次のトランザクション タグを直接探す方法はありますか?

いいえ。SAX パーサーを作成して、不正なトランザクション ブロック内のタグの参照をスキップするタイミングを知る必要があります。とはいえ、SAX よりもSTAXに切り替えたほうが、このようなことを行うのが簡単であることがわかるでしょう。

于 2013-08-05T18:14:04.027 に答える
0

sax パーサーは、常に各 XML 要素に対してコールバックを呼び出します。無視する条件を検出したら
、 field を設定することで質問を解決できます。isIgnoreCurrentTransaction次に、他の sax コールバックで isIgnoreCurrentTransactionamd をチェックしますが、その場合は何もしません。

于 2013-08-05T18:14:28.663 に答える
0

SAX パーサーは、次の要素の開始位置を知るために、すべてのサブツリー (「< abc>< def>< /def>< /abc>」など) をスキャンする必要があります。これは、単一の XML ドキュメントに対して XML パーサーを並列化できない理由でもあります。

あなたの場合、私が考えることができるチューニングの唯一の2つの方法:

1) 解析する XML ドキュメントが多数ある場合は、ドキュメントごとに 1 つのパーサーを独自のスレッドで実行できます。これにより、少なくとも全体的な作業が並列化され、利用可能なすべての CPU とコアが利用されます。

2) 特定の条件 (< transaction ts="2"> のように) まで読み取る必要がある場合は、その条件に到達するとすぐに解析をスキップできます。パーサーをスキップすると解決する場合は、例外をスローします。

startElement内の の実装は次のContentHandlerようになります。

public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
    if(atts == null) return;
        if(localName.equals("transaction") && "2".equals(atts.getValue("ts"))) {
            // TODO: Whatever should happen when condition is reached
            throw new SAXException("Condition reached. Just skip rest of parsing");
        }
    }
于 2013-08-05T18:45:03.687 に答える
0

SAX 実装で制御フラグを使用できます。これは、特定のタグで条件を検出したときに発生し、タグを終了するとフラグを再び下げることができます。そのフラグを使用して、パーサーが関心のないタグの子を実行するときに処理をスキップできます。

ただし、XML の例は有効ではないことに注意してください。コメントに記載されているように、SAX 実装で処理する前に、タグを適切にネストする必要があります。

于 2013-08-05T18:17:23.990 に答える