2012-02-13 39 views
0

我想使用XStream導入大型XML文件(〜1 GB)。我想用ObjectInputStream來讀取它們,但我需要跳過第一個元素,然後向下移動幾個元素(請參閱下面的內容,我需要導入bag_LVC:Woonplaats元素)。XStream:如何讓xstream.createObjectInputStream()尋找特定元素

我希望有某種方法可以爲xstream提供一個Reader或者一個InputStream,這個方法一直在尋找我感興趣的元素。我試圖創建自己的HierarchicalStreamReader並將其移動到正確的元素,但你只能上下移動:

HierarchicalStreamReader xpp = new XppDriver().createReader(xmlFile); 
xpp.moveDown(); // moves to <xb:antwoord> 
xpp.move(); // **would move to <xb:producten>, but it private** 
xpp.moveDown(); // moves to <xb:producten> 
xpp.moveDown(); // moves to <product_LVC:LVC-product> 
st = xstream.createObjectInputStream(xpp); 
BagWoonplaats bw = (BagWoonplaats) st.readObject(); 

是否XStream的或任何XPP司機有什麼辦法讓你尋找到我的元素的利益?

XML

<xb:BAG-Extract-Deelbestand-LVC> 
    <xb:antwoord> 
    <xb:vraag> 
    <!-- more elements here --> 
    </xb:vraag> 
    <xb:producten> 
     <product_LVC:LVC-product> 
     <bag_LVC:Woonplaats> 
      <!-- elements used as fields --> 
     </bag_LVC:Woonplaats> 
     <bag_LVC:Woonplaats> 
      <!-- elements used as fields --> 
     </bag_LVC:Woonplaats> 
     <!-- and so on --> 

回答

0

這個問題的解決辦法其實很瑣碎,我都不好意思了,但是讓我們無論如何分享這個問題的答案。我沒有拿到API爲HierarchicalStreamReader中的XStream的代碼周圍挖後,我設法得到一個處理它,這是它如何工作的:

HierarchicalStreamReader xpp = ...; 
    while(xpp.hasMoreChildren()) { 
     xpp.moveDown(); 
     // do something with the child element, and recursive into this again if appropriate 
     xpp.moveUp(); 
    } 

這是遞歸的方法我現在用的尋求適當的元素。該位置由一個xpath表達式(當然非常基本)指定,我已將其預先歸一化爲ArrayList:

private void seekToElement(HierarchicalStreamReader xpp, ArrayList<String> xpathishArray) { 
    while(xpp.hasMoreChildren()) { 
     xpp.moveDown(); 
     if(xpp.getNodeName().equals(xpathishArray.get(0))) { 
      if(xpathishArray.size() > 1) { 
       xpathishArray.remove(0); 
       seekToElement(xpp, xpathishArray); 
      } 
      return; 
     } 
     xpp.moveUp(); 
    } 
}