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単純にオーバーライドし、例外をログに記録します。errorfatalErrorwarningjavax.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 解析エラーはキャッチしません。そのためには、ErrorHandler を Xerces パーサーに提供する必要があります。

于 2012-10-08T14:28:41.760 に答える
0

問題は、を ではなくErrorListenerに設定する必要があるという事実から生じました。TransformerTransformerFactory

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