2013-03-13 77 views
2

我使用Saxon 9來執行Java中的XSL轉換。如果在轉換過程中出現錯誤,Saxon會將輸出導向其所運行的JVM的標準錯誤流。我的Java應用程序有標準輸出和錯誤的日誌記錄機制。我如何強制Saxon使用錯誤輸出流而不是JVM默認錯誤輸出流?如何在Java中更改Saxon的標準錯誤輸出流?

回答

2

撒克遜將錯誤轉移到javax.xml.transform.ErrorListener對象。最初,這些對象中有一個將異常寫入stderr,但您可以輕鬆創建新的ErrorListener對象並實現它的warning,errorfatalError方法,以將它們發送到您的自定義日誌記錄機制。

如何設置新的ErrorListener取決於whether you are using the JAXP interface or the s9api interface。對於JAXP接口,您可以在Transformer對象上調用setErrorListener。對於s9api接口,您可以在創建處理器時或在XsltCompiler對象或XsltTransformer對象上提供的配置對象上使用setErrorListener方法。無論如何,其中有幾個。

像這樣的東西(s9api):

final PrintStream logFile = 
    new java.io.PrintStream("errorlog.txt"); // for example 

Configuration configuration = new Configuration(); 
configuration.setErrorListener(new ErrorListener() { 
    @Override 
    public void warning(TransformerException exception) throws TransformerException { 
     exception.printStackTrace(logFile); // or wherever 
    } 

    @Override 
    public void error(TransformerException exception) throws TransformerException { 
     exception.printStackTrace(logFile); 
    } 

    @Override 
    public void fatalError(TransformerException exception) throws TransformerException { 
     exception.printStackTrace(logFile); 
    } 
}); 
Processor proc = new Processor(configuration); 
... 

如果你不想使用標準錯誤程序中的事情,雖然,它可能會更好,只是把它重定向程序範圍內使用System.setErr

System.setErr(new java.io.PrintStream("errorlog.txt")); 

它需要一個PrintStream對象,您可以環繞任何類型的輸出/流,因此我確信它可以用於您的自定義日誌記錄機制。