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); 
     } 
    } 

ale ja się tu wyjątkiem:java.lang.IllegalArgumentException: Nie jest obsługiwany: tiret numer

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

java.lang.IllegalArgumentException: Nie jest obsługiwany: tiret numer

my java:

java version "1.6.0_33" 

dlaczego dostaję ten błąd?

Odpowiedz

-2

Powinieneś użyć predefiniowanej stałej OutputKeys.INDENT, lub jeśli naprawdę nalegasz na zakodowanie wartości, powinno to być "wcięcie", a nie "liczba wcięć".

+2

To za mało: umieszcza elementy na nowych liniach, ale nie dodaje zakładek ... – Mapio

10

naprawiłem ten wyjątek, komentując tę ​​linię:

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

i dodanie tej linii:

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

Wyjątkiem zniknął chociaż indetation który pojawia się w wyszukiwarce jest nieprawidłowy.

0

Prawdopodobnie dlatego, że Xalan (w pakiecie w JDK1.6/1.7) obsługuje "liczbę wcięć", jeszcze inne nie mają i nie mają własnego sposobu określania rozmiaru wcięcia. Musisz więc wprowadzić ciąg znaków odpowiedni dla dostawcy XSLT. Sprawdź, czego używasz i zapoznaj się z dokumentami. Czy nie są to standardy, które nie określają takich rzeczy jako doskonałe?

1

Zamiast

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 

trzeba napisać

TransformerFactory transformerFactory = new TransformerFactoryImpl(); 

ponieważ nie wszystkie implementacje TransformerFactory mieć to pole "indent-number".

Powiązane problemy