2015-11-05 28 views
1

這是一個小片段,試圖重置javax.xml.transform.Transformer的輸出屬性。如何重置Transformer輸出屬性?

Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
Properties originalOutputProperties = transformer.getOutputProperties(); 

System.out.println("ORIG= " + originalOutputProperties); 
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 

System.out.println("BEFORE RESET= " + transformer.getOutputProperties()); 
transformer.setOutputProperties(originalOutputProperties); 

System.out.println("AFTER RESET= " + transformer.getOutputProperties()); 

這是輸出中:

ORIG= {} 
BEFORE RESET= {encoding=UTF-8} 
AFTER RESET= {encoding=UTF-8} 

正如你可以看到,原來的輸出性能不是原有的。

如何重置輸出屬性?

編輯
變壓器重複使用多次。 在這種情況下,這裏是我所期望的:

ORIG= {} 
BEFORE RESET= {encoding=UTF-8} 
AFTER RESET= {} 

ORIG= {} 
BEFORE RESET= {indent=yes, encoding=UTF-8, {http://xml.apache.org/xslt}indent-amount=4, omit-xml-declaration=yes} 
AFTER RESET= {} 
+1

我無法解釋這種行爲,但我通常會建議爲每次轉換創建一個新的Transformer。如果重複使用相同的樣式表,重用Templates對象很重要,但是從Templates對象創建新的Transformer應該至少與重置現有的一樣便宜。 –

+0

@MichaelKay我選擇每次創建新的Transformer。我可以容忍重複創作引入的任何「開銷」。 – Stephan

回答

1

我必須維護的項目依賴於Java 1.6.0_24。當調用TransformerFactory.newInstance().newTransformer()時,此版本的Java將返回com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl的實例。

該實現允許重置輸出屬性一次

我的解決方法是每次需要變壓器時從TransfomerFactory創建一個新的新鮮Transformer實例。

+0

是的,當然,這是另一種有效的方法... –

1

設置回originalOutputProperties(如果仍然適用)之前嘗試transformer.setOutputProperties(null);。根據Transformer.setOutputProperties(Properties)的Javadoc:

如果參數給此函數爲空時,任何性質預先設定 被去除,並且該值將恢復到在 模板中定義對象的值。

------------ ------------ UPDATE

TransformerImpl我看到reset()方法重置的一切,不僅輸出參數。也許這對您的需求太多了......

另一種選擇可能是單獨重置所需的屬性(例如,OutputKeys.ENCODING)。這應該不止一次地工作。

另一種替代方案可能在於使用一組必須使用的輸出參數。但是否應該以這種方式進行取決於您碰巧使用多少個這樣的參數集......

+0

當'transformer.setOutputProperties(null);'在第一次被調用**時**它**。在相同變壓器實例上的連續調用中,'setOutputProperties(null)'調用變爲不可操作。 (** Java 1.6.0_24 **) – Stephan

+0

請參閱上面的我的更新。 –

+0

'reset()'在內部調用'setOutproperties(null)'因此我將面臨同樣的問題。單獨重置屬性也不起作用。 – Stephan