我的XSLT
基于Xalan
:
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
只会覆盖error
类中的fatalError
,warning
和javax.xml.transform.ErrorListener
方法并记录异常:
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.
程序正常执行:没有抛出或记录异常,生成的文件为空!
如何捕捉异常以我想要的方式处理它?</ p>
答案 0 :(得分:1)
您提供给Xalan的ErrorListener捕获转换错误,但它不会捕获XML解析错误。为此,您需要为Xerces解析器提供ErrorHandler。
答案 1 :(得分:0)
问题来自于ErrorListener
需要设置为Transformer
而不是TransformerFactory
:
Transformer transformer = factory.newTransformer(config);
transformer.setErrorListener(listener);