2016-11-02 42 views
0

我正在使用Woodstox在我的應用程序中傳輸XML文檔。我需要在模式定義的元素上設置默認屬性,然後才能處理這些元素,但使用Woodstox執行此操作的唯一方法是使用額外的XMLStreamReader將文檔讀入內存,並使用一些邏輯來編寫默認屬性,將其寫出到內存中的XML文檔,然後將內存中的文檔傳遞到業務邏輯中。Java:在XMLStreamReader2上設置屬性?

我不喜歡這樣。我想爲每個元素傳遞文檔以保持內存佔用低,因爲文檔可能很大,並且我正在應用程序中運行這個文檔的多個實例。在流式處理文檔時,是否有方法將屬性注入到XMLStreamReader中?我已經找到了一種方法來跳過節點,我不感興趣,而流:

public class XMLPreProcessor extends StreamReader2Delegate { 
    public XMLPreProcessor(XMLStreamReader2 sr) { 
     super(sr); 
    } 

    //Skip over all processing instructions 
    //Can this be extended to inject attributes to elements? 
    @Override 
    public int next() throws XMLStreamException { 
     int eventType = super.next(); 

     while(eventType == XMLStreamConstants.PROCESSING_INSTRUCTION) { 
      eventType = super.next(); 
     } 

     return eventType; 
    } 
} 

可以此委託進行調整注入屬性爲XMLStreamReader的?

回答

1

不,我不認爲有這樣的設施來注入內容。如果您使用Event API(XMLEventReader),則可能可能會修改元素對象。

但是:您的方法,使用委託,可能工作。您需要覆蓋訪問屬性的所有方法,並保留其他屬性的狀態。所以當被問及有多少屬性時,你會返回原始計數加註入屬性;並可能在原創後添加新的。 這聽起來很可行;在讀取START_ELEMENT時,您可能還需要覆蓋next()以更新狀態,並在前進之後丟棄。

+0

我最終用XMLEventReader封裝了委託,並覆蓋了'nextEvent()'方法在元素上注入默認屬性。在XMLStreamReader上覆蓋的方法太多了,再加上它是特定於實現的,所以對於特殊功能來說這是太多的工作。重寫XMLEventReader更簡單,如果更改實現,重寫會更容易。 – user1428945