2013-02-28 8 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 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 (जैसा कि जेडीके 1.6/1.7 में पैक किया गया है) "इंडेंट-नंबर" का समर्थन करता है, फिर भी दूसरों को इंडेंट के आकार को निर्दिष्ट करने का अपना तरीका नहीं है। इसलिए आपको XSLT प्रदाता के लिए उपयुक्त स्ट्रिंग में रखना होगा। आप जिस काम का उपयोग कर रहे हैं उसका उपयोग करें और उसके दस्तावेज़ देखें

ऐसे मानदंड नहीं हैं जो ऐसी चीजें निर्दिष्ट नहीं करते हैं?

1

TransformerFactory transformerFactory = TransformerFactory.newInstance(); 

के बजाय

आप

TransformerFactory transformerFactory = new TransformerFactoryImpl(); 

लिखना चाहिए क्योंकि TransformerFactory के सभी कार्यान्वयन कि क्षेत्र "indent-number" नहीं।

संबंधित मुद्दे