2017-05-18 5 views
0

StaxとXStreamを初めて使用しています。私は巨大なXMLストリームからのいくつかの共通の要素を非整列しようとしています(非整列化のために150万から250万の要素があるかもしれません)StAXからXStreamパーシャルパーサーを入力する方法

私はStaxにストリームを解析して要素を取得し、 XMLをEndElementまでアンマーシャリングします。

XMLStreamReader reader = xmlInputFactory.createXMLStreamReader(fis); 
      while (reader.hasNext()) { 
       if (reader.isStartElement() && reader.getLocalName().toLowerCase().equals("person")) { 
        break; 
       } 
       reader.next(); 
      } 

      StaxDriver sd = new StaxDriver(); 
      AbstractPullReader rd = sd.createStaxReader(reader); 
      XStream xstream = new XStream(sd); 
      xstream.registerConverter(new PersonConverter()); 
      Person p = (Person) xstream.unmarshal(rd); 

私はこれで問題テスト入力 <Persons> <Person> <name>A</name> </Person> <Person> <name>B</name> </Person> <Person> <name>C</name> </Person> </Persons>

を作成し、最初に私のコンバータが呼び出されていないということです。次に、Personの要素 "name"に対してCannotResolveClassExceptionを取得し、XStreamはPersonオブジェクトを作成しません。 私のコードで何が欠けていましたか?

答えて

1

AbstractPullReaderをインスタンス化すると、ストリームから最初のオープン要素イベントが読み込まれ、 "ルート"要素が確立されます。すでに最初のPersonイベントを読み込んでいるため、次のイベント(name)に進みます。アンマーシャリングの仕方はわかりません。

あなたはあなたの例の仕事を作るために2つのことを行う必要があります:あなたのJavaクラス

xstream.alias("Person", Person.class); 

第二に、要素名Person別名

まず、のみにSAXカーソルを進めます要素の前にあなたが読むことをお望みの人:

while (reader.hasNext()) {   
    if (reader.isStartElement() && reader.getLocalName().equals("Persons")) {    
     break; 
    } 
    reader.next(); 
} 
+0

ありがとうございます。それは機能しますが、私は解析したい要素の前に一つの要素を止めるように強制されます。 Personが最初の子としていくつかのオプション要素を含む場合はどうでしょうか? StAXリーダーAPIは、先読みメソッドを提供していません。 – Bassam

関連する問題