public String filter(String message) {
if (message == null) {
return null;
}
// Remove formatting, transformer fails to handle wrong indentation correctly.
message = message.replaceAll(">\\s*[\\r\\n]+\\s*", ">");
message = message.replaceAll("\\s*[\\r\\n]+\\s*", " "); // for wrapped attribute lists
Source xmlInput = new StreamSource(new StringReader(message));
StringWriter stringWriter = new StringWriter();
try {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
transformerFactory.setAttribute("indent-number", INDENT); // for Java 6
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", INDENT.toString()); // Java 1.5
transformer.transform(xmlInput, new StreamResult(stringWriter));
String pretty = stringWriter.toString();
pretty = pretty.replace("\r\n", "\n");
return pretty;
} catch (TransformerException e) {
if (e.getCause() != null && e.getCause() instanceof SAXParseException) {
return message;
}
throw new RuntimeException(e);
}
}
但我在这里得到例外:
transformerFactory.setAttribute("indent-number", INDENT); // for Java 6
java.lang.IllegalArgumentException:不支持:indent-number
我的java:
java version "1.6.0_33"
为什么我会收到此错误?
答案 0 :(得分:12)
我通过评论此行来修复该异常:
transformerFactory.setAttribute("indent-number", indent);
并添加以下行:
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
即使浏览器中出现的修改不正确,异常也就消失了。
答案 1 :(得分:1)
而不是
TransformerFactory transformerFactory = TransformerFactory.newInstance();
你应该写
TransformerFactory transformerFactory = new TransformerFactoryImpl();
因为并非TransformerFactory
的所有实施都具有该字段"indent-number"
。
答案 2 :(得分:0)
可能因为Xalan(在JDK1.6 / 1.7中打包)支持“indent-number”,但是其他人没有并且有自己的方式来指定缩进的大小。所以你必须放入适合XSLT提供程序的字符串。找出你正在使用的内容并查看其文档
不是那些没有指明这些事情的标准吗?
答案 3 :(得分:-2)
您应该使用预定义的常量OutputKeys.INDENT
,或者如果您真的坚持对值进行硬编码,则应该是'缩进',而不是'缩进号码'。