2009-04-26 25 views
2

我目前使用POI嘗試從一批Word文檔中提取文本,並且需要能夠確定文檔包含的條目。我已經能夠拉到文檔根目錄並拉第一個條目,但我希望能夠查看所有條目。 getEntries()方法似乎提供此功能,但我不知道如何使用getViewableIterator()將它們拉出。如何在POI中使用getViewableIterator

下面是我的代碼明智:

<cfset myFile = createObject("java", "java.io.FileInputStream").init(fileInputPath)> 
<cfset fileSystem = CreateObject("java", "org.apache.poi.poifs.filesystem.POIFSFileSystem").Init(myFile)> 

<cfloop from="1" to="#fileSystem.getRoot().getEntryCount()#" index="i"> 
    <cfset viewableIterator = fileSystem.getRoot().getEntries().next().getViewableIterator()> 
    <cfset nextEntry = fileSystem.getRoot().getEntries().next()> 
    <cfif viewableIterator.hasNext()> 
     <cfdump var="#nextEntry.getShortDescription()#"> 
     <cfset viewableIterator.remove()> 
    </cfif> 
</cfloop> 

在第一循環中,我能夠獲得的第一項就好了。但是,只要執行remove(),就會收到java.lang.IllegalStateException錯誤。很明顯,我沒有正確使用remove()方法,但我一直無法找到如何正確使用它的任何示例。任何幫助將不勝感激。

回答

0

我真的不明白你的XML標記(我通常使用Java以正常形式,用花括號和東西),但一般一個Java迭代器的工作原理如下所示:

while(iterator.hasNext()) { 
    x = iterator.next(); // get element 
    // do with x what you want 
    if (/*you want to remove x from the underlying list*/) 
     iterator.remove(); 
} 

在實踐中,刪除僅用於非常少的情況,如果您想要通過收集並刪除您不再需要的所有內容。如果collecion是隻讀的,或者如果您試圖同時使用兩個不同的迭代器遍歷它兩次,則remove可能失敗。只要堅持使用hasNext和next。

+0

好,以確保我正確地理解這一點,在循環中x的每次通話,迭代器會自動移動到哈希的下一個元素? (順便說一下,你看到的XML實際上並不是XML,它是ColdFusion標記) – 2009-04-26 20:41:39

+0

是的,只要你調用next(),迭代器就會移動到下一個元素。 – mihi 2009-04-27 17:12:17