如何重置Transformer输出属性?

时间:2015-11-05 15:45:04

标签: java xml

这是一个小片段,试图重置javax.xml.transform.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= {}

2 个答案:

答案 0 :(得分:1)

在设置transformer.setOutputProperties(null);之前尝试originalOutputProperties(如果仍然适用)。根据{{​​1}} Javadoc:

  

如果此函数的参数为​​null,则先前设置的任何属性   将被删除,该值将恢复为中定义的值   模板对象。

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

Transformer.setOutputProperties(Properties)我看到TransformerImpl方法重置所有内容,而不仅仅是输出参数。也许这对你的需求来说太过分了......

另一种选择可能包括单独重置您想要的属性(例如reset())。这应该不止一次。

另一种替代方法可能是使用每组输出参数OutputKeys.ENCODING。但是你是否应该以这种方式进行取决于你碰巧使用了多少套这样的参数......

答案 1 :(得分:1)

我必须维护的项目依赖于Java 1.6.0_24。调用TransformerFactory.newInstance().newTransformer()时,此版本的Java将返回com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl

的实例

此实现允许重置输出属性一次

我的解决方法是每次需要变换器时从Transformer创建一个新的TransfomerFactory实例。