//Parse an HTML file into text while preserving carriage returns
StringBuffer temp = new StringBuffer(html);
final StringBuffer sb = new StringBuffer();//this will be my output
HTMLEditorKit.ParserCallback parserCallback = new
HTMLEditorKit.ParserCallback() {
public boolean readyForNewline;
@Override
public void handleText(final char[] data, final int pos) {
String s = new String(data);
sb.append(s.trim() + " ");
readyForNewline = true;
}
@Override
public void handleStartTag(final HTML.Tag t,
final MutableAttributeSet a,
final int pos) {
if (readyForNewline &&
(t == HTML.Tag.DIV || t == HTML.Tag.BR ||
t == HTML.Tag.P || t == HTML.Tag.TR)) {
sb.append("\n");
readyForNewline = false;
}
}
@Override
public void handleSimpleTag(final HTML.Tag t,
final MutableAttributeSet a,
final int pos) {
handleStartTag(t, a, pos);
}
};
try {
new ParserDelegator().parse(new StringReader(temp.toString()),
parserCallback, false);
} catch (IOException e) {
return null;
}
이 코드는 작은 HTML 파일에 잘 작동하지만 내가 문자열로 변환 된 ~ 4메가바이트 HTML 파일을 구문 분석 할 때, 그것은 IOException가 발생하고 내가 가진 왜 그럴까? 그것은 시도 루프에서, 콘솔이 오류를 인쇄하지 않기 때문에 그것을 찾으려면 잠시 시간이 걸렸습니다.자바 - 입력이 큰 경우 ParserDelegator에서 예외가 발생
기본적으로이 코드는 줄 간격을 유지하면서 HTML 파일을 가져 와서 태그를 제거합니다. 나는이 코드를 찾아서 빌려 왔고 대안 솔루션은 JSoup과 많은 다른 것들로부터도 괜찮습니다. 이것은 (어쨌든 작은 파일에서) 내가 원하는 것을 얻을 수있는 유일한 솔루션입니다. 파일이 너무 클 때이 코드가 IOException을 throw하는 이유가 있습니까? 그것을 고치는 방법?
감사합니다.
편집 : 여기 스택의
javax.swing.text.ChangedCharSetException
at javax.swing.text.html.parser.DocumentParser.handleEmptyTag(Unknown Source)
at javax.swing.text.html.parser.Parser.startTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseTag(Unknown Source)
at javax.swing.text.html.parser.Parser.parseContent(Unknown Source)
at javax.swing.text.html.parser.Parser.parse(Unknown Source)
at javax.swing.text.html.parser.DocumentParser.parse(Unknown Source)
at javax.swing.text.html.parser.ParserDelegator.parse(Unknown Source)
at org.SmartTable.SmartTable.htmlToText(SmartTable.java:293)
at org.SmartTable.SmartTable.<init>(SmartTable.java:35)
당신이 예외의 스택을 게시 할 수있는 캐릭터 세트 무시 변경? – Claudiu
방금 메인 포스트에 편집했습니다 –
해결 방법 : new ParserDelegator(). parse (new StringReader (temp.toString()), parserCallback, true); // 마지막 "false"를 true로 변경하여 charset을 무시합니다. –