2016-09-20 5 views
0

Hy、 私はfooのリストで(非常に)大きなXMLファイル(100GB)を持っている、私はそれを紹介するようなストリームに変換したいオブジェクトのJava 8に:どのように大規模なXMLファイルをストリームするようにオブジェクトのストリームのようなjava8

libまたはコードサンプルのアイデア?最後に

<foos> 
    <foo>...</foo> 
    <foo>...</foo> 
</foos> 

:初めに

Stream<Foo> foosStream = ????("foo.xml") 
streamFoos.forEach(foo->foo.doFooStuffs()); 

編集: お礼を@Pierre、ここではあなたのソリューションの実装です:

try { 
      XMLEventReader reader = XMLInputFactory.newInstance(). 
        createXMLEventReader(stream); 
      final Unmarshaller unmarshaller = JAXBContext.newInstance(XXXXX.class).createUnmarshaller(); 

      Iterator<XXXXX> it = new XmlIterator<>(reader, unmarshaller, "xxxxxx"); 
      return StreamSupport.stream(Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED), false); 
     } catch (XMLStreamException e1) { 
      logger.error("XMLStreamException", e1); 
     } catch (JAXBException e) { 
      logger.error("JAXBException", e); 
     } 

および

public class XmlIterator<T> implements Iterator<T> { 

    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 

    XMLEventReader reader; 

    XMLEvent event; 

    Unmarshaller unmarshaller; 
    String name; 

    public XmlIterator(XMLEventReader reader, Unmarshaller unmarshaller, String name) { 
     this.reader = reader; 
     this.unmarshaller = unmarshaller; 
     this.name = name; 
     try { 
      reader.next(); 
      this.event = reader.peek(); 
     } catch (XMLStreamException e) { 
      logger.error("", e); 
      event = null; 
     } 
    } 

    @Override 
    public boolean hasNext() { 
     try { 
      while (event != null && !(event.isStartElement() && name.equals(event.asStartElement().getName().getLocalPart()))) { 
       Object a = reader.next(); 
       event = reader.peek(); 
      } 
      return event != null; 

     } catch (XMLStreamException e) { 
      logger.error("", e); 
      event = null; 
     } 
     return event != null; 
    } 

    @Override 
    public T next() { 
     try { 
      T next = ((JAXBElement<T>) unmarshaller.unmarshal(reader)).getValue(); 
      event = reader.peek(); 
      return next; 
     } catch (JAXBException e) { 
      logger.error("error during unmarshalling ", e); 
      return null; 
     } catch (XMLStreamException e) { 
      logger.error("error during stream ", e); 
      return null; 
     } 
    } 
} 
+1

JavaでXMLファイルを読み込むためのさまざまな手法とAPIがありますか?ここにはどちらが適していると思いますか? XMLファイルのサイズはどれくらいですか?おそらく、あなたは[StAX](https://docs.oracle.com/javase/tutorial/jaxp/stax/api.html)を見たいと思っていますが、質問に文脈を追加することはできますか? – Tunaki

+1

はい、私は多くのlibを知っていますが、それらはすべて非常に低レベルです。なぜ2016年に私はXパスを指定しなければならない時にストリームを生成するためにstart_elementを手動で分析しなければならないのか理解できません。 – sab

+0

"私はストリームを自分自身に生成するためにstart_elementをマニュアルで分析する必要があります":jaxb(=データスキーマの定義) – Pierre

答えて

3
+0

ストリームを使用せず、フー 'コールが発生しました... – fabian

+0

私はストリームより前の日付のように見えるすべてのライブラリは、最近のライブラリはありません? – sab

+0

これは、構文解析を開始する前に、XML全体をメモリに格納する必要がありますか? – Bassam

関連する問題