2012-10-08 69 views
0

我已經基於Xalan的folowwing XSLT與Xalan的XSLT捕獲異常

TransformerFactory factory = TransformerFactory.newInstance(); 
XalanErrorListener listener = new XalanErrorListener(); 
factory.setErrorListener(listener); 

// Create transformer 
StreamSource config = new StreamSource(xslPath); 
Transformer transformer = factory.newTransformer(config); 

// Create input/ouput 
StreamSource source = new StreamSource(inputPath); 
StreamResult result = new StreamResult(outputPath); 

// Transform 
transformer.transform(source, result); 

XalanErrorListener簡單地覆蓋從javax.xml.transform.ErrorListenererrorfatalErrorwarning方法和記錄異常:

public final class XalanErrorListener implements ErrorListener { 

static final Logger LOGGER = LoggerFactory.getLogger(XalanErrorListener.class); 

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

@Override 
public void fatalError(TransformerException exception) throws TransformerException { 
    LOGGER.error(exception); 
} 

@Override 
public void warning(TransformerException exception) throws TransformerException { 
    LOGGER.warn(exception); 
} 
} 

然而,當在編碼嚴重的文件上執行時,控制檯中會顯示以下消息:

(Location of error unknown) 
    com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 
    Invalid byte 2 of 2-byte UTF-8 sequence. 

程序正常執行:沒有拋出或記錄異常,並且生成的文件爲空!

我該如何捕捉異常來處理它我想要的方式?

+1

所以''XalanErrorListener是一類你寫的嗎?如果是這樣,您必須顯示該課程... – home

+0

編輯完成! –

回答

0

問題的事實就到了ErrorListener需要被設置爲Transformer而不是TransformerFactory

Transformer transformer = factory.newTransformer(config); 
transformer.setErrorListener(listener); 
+2

如果在newTransformer期間發生異常,我不明白在事實允許異常拋出後如何在變換器上設置偵聽器。 – Amalgovinus

1

您提供給Xalan的ErrorListener會捕獲轉換錯誤,但不會捕獲XML解析錯誤。爲此,您需要爲Xerces解析器提供一個ErrorHandler。

+0

我該怎麼做? –

+0

將輸入作爲SAXSource提供給轉換;在SAXSource中自己創建XMLReader;初始化它的ErrorHandler屬性。 –