0

我有以下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.

程序正常执行:没有抛出或记录异常,生成的文件为空!

如何捕获异常以按我想要的方式处理它?

4

2 回答 2

1

您提供给 Xalan 的 ErrorListener 会捕获转换错误,但不会捕获 XML 解析错误。为此,您需要向 Xerces 解析器提供一个 ErrorHandler。

于 2012-10-08T14:28:41.760 回答
0

问题来自于ErrorListener需要设置为Transformer而不是TransformerFactory

Transformer transformer = factory.newTransformer(config);
transformer.setErrorListener(listener);
于 2012-10-09T16:21:34.840 回答