2017-05-18 101 views
0

我是Stax和XStream的新手。我試圖從大量的XML流中解開一些常見的元素(可能有150萬到250萬個解組元素)如何讓XStream解析來自StAX的部分輸入

我試圖通過Stax來解析流來獲取感興趣的元素,然後調用xStream將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),它不知道如何解組。

你必須做兩件事情,使您的工作例如:

首先,別名元素名稱Person到Java類

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

其次,只有推動SAX光標到元件之前你想讀的:

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

謝謝。這有效,但我不得不在我想解析的那個元素之前停止一個元素。如果人員可能包含一些可選元素作爲其第一個孩子會怎麼樣? StAX閱讀器API不提供「向前看」方法。 – Bassam