2016-08-24 42 views
0

我正在使用數據處理Document對象,其中一些節點具有與其關聯的userData(使用setUserData(<key>, <value>, <handler>))。我想將Document的副本保存爲XML,並將userData值作爲屬性導出。將DOM文檔導出爲XML,其userData屬性爲

變壓器

這是我所知道的輸出XML的方式:

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
DOMSource source = new DOMSource(<Document>); 
StreamResult result = new StreamResult(System.out); 
transformer.transform(source, result); 

但我不能找到一種方法,在方法鉤在兩個舊的和新的Node對象存在 - 我在挖掘到Transformer時能找到的唯一地方是類DOM2TO,它將節點轉換爲例如。 SAX調用startElement(...),但是我不能在這裏修改任何東西,而無需複製整個代碼。

UserDataHandler

我的第二個方法是使用一個UserDataHandler與用戶數據一起連接到節點。該處理程序必須提供一個名爲eg的方法handle(short operation, String key, Object data, Node src, Node dst)。當節點被克隆時。因此可以編寫一個UserDataHandler來檢查userData的src節點,並將其作爲屬性添加到dst,然後在從克隆中寫入XML之前簡單地克隆Document。 不幸的是,handle(...)dst節點克隆未完成的階段被調用:當src具有屬性時,dst將在此時指向相同的AttributeMap實例。因此,整個過程毫無價值,因爲添加的屬性也會被添加到原始文檔中,我不想這樣做。

回答

1

得到它解決 - 我必須用戶UserDataHandler在NODE_IMPORTED工作:然後handle(...)方法調用與完全克隆dst節點。

雖然這不是一個很好的解決方案,但克隆(hrm,導入)文檔使所需空間加倍。