【问题标题】:java.lang.IllegalArgumentException: Not supported: indent-numberjava.lang.IllegalArgumentException:不支持:缩进数
【发布时间】:2013-02-14 14:29:59
【问题描述】:
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:

java version "1.6.0_33"

为什么会出现这个错误?

【问题讨论】:

    标签: java xml xslt


    【解决方案1】:

    我通过注释这一行修复了该异常:

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

    并添加这一行:

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

    即使出现在浏览器中的 indetation 不正确,异常也会消失。

    【讨论】:

    • 这似乎不再适用于 JDK8 和 JBoss EAP 7/Wildfly 10 - 我现在收到此错误“java.lang.IllegalArgumentException: Not supported: indent-number”
    【解决方案2】:

    代替

    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    

    你应该写

    TransformerFactory transformerFactory = new TransformerFactoryImpl();
    

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

    【讨论】:

      【解决方案3】:

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

      不指定这些东西的标准不是很好吗?

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这还不够:它会将元素放在新行上,但不会添加标签......
        猜你喜欢
        • 2016-07-09
        • 2019-08-10
        • 2018-07-20
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 2021-12-08
        • 1970-01-01
        相关资源
        最近更新 更多