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:サポートされていません:indent-number

私のJava:

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 に答える
0

Xalan (JDK1.6/1.7 にパッケージ化されている) が「インデント番号」をサポートしているためと考えられますが、他のものはインデントのサイズを指定する独自の方法を持っていません。したがって、XSLT プロバイダーに適した文字列を入力する必要があります。使用しているものを調べて、そのドキュメントを参照してください

そういうことを明記しない規格ってすごいじゃないですか。

于 2014-02-07T07:54:40.203 に答える
-2

事前定義された定数を使用するOutputKeys.INDENTか、値をハードコーディングすることを強く主張する場合は、「indent-number」ではなく「indent」にする必要があります。

于 2013-02-28T11:59:02.743 に答える