2013-02-28 19 views
5
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); 
     } 
    } 

しかし、私はここで例外を取得:java.lang.IllegalArgumentExceptionが:サポートされていません:インデント-数

transformerFactory.setAttribute("indent-number", INDENT); // for Java 6 

java.lang.IllegalArgumentExceptionが:サポートされていません:インデント-数

my java:

java version "1.6.0_33" 

なぜこのエラーが出るのですか?

答えて

-2

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

+2

十分ではありません:新しい行に要素を配置しますが、タブは追加しません。 – Mapio

10

私は、この行コメントでその例外を固定:

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

をして、この行を追加:

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

例外がブラウザに表示されますindetationが間違っているにもかかわらず、なくなっています。

0

Xalan(JDK1.6/1.7にパッケージ化されている)は "indent-number"をサポートしている可能性がありますが、インデントのサイズを指定する方法はありません。したがって、XSLTプロバイダに適した文字列を入力する必要があります。あなたが使っているワークアウトして、その文書を参照してください

このようなことは特に指定していませんか? TransformerFactoryのすべての実装は、そのフィールド"indent-number"を持っていないので、代わりに

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 

1

あなたは

TransformerFactory transformerFactory = new TransformerFactoryImpl(); 

を記述する必要があります。

関連する問題