2013-02-28 2 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: Не поддерживается: отступа номер

мой java:

java version "1.6.0_33" 

Почему я получаю эту ошибку?

ответ

-2

Вы должны использовать предопределенную константу OutputKeys.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. Разработайте, что вы используете, и посмотрите его документы.

Не являются ли стандарты, которые не указывают такие вещи?

1

Вместо

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 

вы должны написать

TransformerFactory transformerFactory = new TransformerFactoryImpl(); 

, потому что не все реализации TransformerFactory есть это поле "indent-number".

Смежные вопросы