11
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:不支持:缩进数

我的爪哇:

java version "1.6.0_33"

为什么我得到这个错误?

4

4 回答 4

14

我通过评论这一行来修复该异常:

transformerFactory.setAttribute("indent-number", indent);

并添加这一行:

transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");

即使浏览器中显示的索引不正确,异常也消失了。

于 2013-05-22T13:24:00.850 回答
2

代替

TransformerFactory transformerFactory = TransformerFactory.newInstance();

你应该写

TransformerFactory transformerFactory = new TransformerFactoryImpl();

因为并非所有的实现TransformerFactory都有这个字段:indent-number.

于 2017-11-22T14:07:19.400 回答
0

可能是因为 Xalan(打包在 JDK1.6/1.7 中)支持“缩进数”,但其他人不支持并且有自己的方式来指定缩进的大小。因此,您必须输入适合 XSLT 提供程序的字符串。找出你正在使用的并查看它的文档

没有规定这些事情的标准不是很好吗?

于 2014-02-07T07:54:40.203 回答
-2

你应该使用预定义的常量OutputKeys.INDENT,或者如果你真的坚持硬编码这个值,它应该是'indent',而不是'indent-number'。

于 2013-02-28T11:59:02.743 回答