2011-01-20 7 views
0

非常に大きなXMLファイルを効率的に解析する必要があるため、ファイル全体をメモリに入れることができません。そのように私はXMLStreamReader内のようなストリーミング技術に見てきたが、これらは非常に低レベルであること、非常にハードコーディングされたコードを生成するために表示されます。JavaからXMLをストリーミング形式で解析する、より一般的な方法は?

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... 
    } 

私は非常に緊密に結合せずにこれを行う方法を探していますパースして解析することに加えて、このコードはちょうどいい気分ではありません。これはより真にイベント指向でなければならないようです。

アドバイスはありますか?

答えて

2

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

2

ストリーミングモードでXMLを処理するためのより高いレベルの言語を探していて、流行に敏感でない場合は、Saxon-EE 9.3 XSLTのストリーミング機能を考慮してください。 XSLT 3.0仕様のドラフト。私はあなたのコードの密結合性質はStAXのとは何であるとは思わない

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

0

は、それはあなたがそれを書くことを選択しただけの方法です。

ハンドラオブジェクトに要素名などのルックアップテーブルを使用して、イベントのハンドリングをハンドラオブジェクトに委譲するコードを簡単にリファクタリングできます。このメカニズムは完全に汎用的で再利用可能です。

+0

"一般的で再利用可能な" xml-parsingコードを書くことができれば、いいライブラリ/フレームワークではないのはなぜですか?彼の「悪いコード」は、インターネット上で見られるものであり、いわゆるベストプラクティスの一例です。大文字小文字のステートメント(またはイベントベースのソリューションを手渡し)を使用してXMLを手動で解析することは、実際に2011年に行うべきことのようですか? – inanutshellus

1

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

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

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

これは、1つのパーサーが異なるxmlメッセージを解析するのに役立ちます。

関連する問題