0

非常に大きくなる可能性のある XML ファイルを効率的に解析する必要があります (したがって、ファイル全体をメモリに格納することはできません)。そのため、XMLStreamReader などのストリーミング技術を調べましたが、これらは非常に低レベルであり、非常にハードコードされたコードを生成するようです。

   event = parser.next();
   switch (event)
   {
    case XMLStreamConstants.START_ELEMENT:
         elementName = parser.getLocalName();
         if (elementName.equals("name")){
             state = FOUND_A_NAME;
         }else if (elementName.equals("address")){
             state = FOUND_AN_ADDRESS;                      
         }
    ETC...
    }

パーサーと解析対象をあまり密接に結び付けずにこれを行う方法を探しています。さらに、このコードは正しくないと感じています。これは、より真にイベント指向であるべきだと思われます。

何かアドバイス?

4

4 に答える 4

2

ストリーミングモードでXMLを処理するための高級言語を探していて、最先端であることを気にしない場合は、Saxon-EE9.3XSLTのストリーミング機能を検討してください。ドラフトXSLT3.0の部分的な実装です。仕様。

http://www.saxonica.com/documentation/sourcedocs/streaming.xml

于 2011-01-20T23:25:16.483 に答える
2

SAX には、あなたが考えるべきことを正確に実行するイベントがあります.. :) http://www.saxproject.org/quickstart.htmlは、それを実行する単純なコードベースを示しています。何か不足していますか?

于 2011-01-20T22:00:37.023 に答える
1

これは一般的に書くことができます。たとえば、xml 要素名とクラス フィールド名/ハッシュマップ キー名の間のマッピングを持つプロパティ ファイルがあります。

if (event.isStartElement()) {
 if  (event.asStartElement().getName().getLocalPart().equals(XMLElementName)) {

    event = eventReader.nextEvent();
    fields.put(classFieldName, event.asCharacters().getData());
        continue;
 }
}

これにより、1 つのパーサーでさまざまな xml メッセージを解析できるようになります。これは単なるアイデアです..もっとできる..

于 2012-01-04T19:13:51.247 に答える
0

あなたのコードの密結合の性質は StAX と関係があるとは思いません。それはあなたがそれを書くために選んだ方法です。

そのコードを簡単にリファクタリングして、イベントの処理をハンドラー オブジェクトに委任できます。たとえば、要素名のルックアップ テーブルをハンドラー オブジェクトに使用します。このメカニズムは、完全に汎用的で再利用可能である可能性があります。

于 2011-01-20T23:30:43.930 に答える