|
SSISO Community검색 |
|
SSISO Community메뉴 |
|
SSISO Community카페 |
|
블로그 카테고리 |
|
|
Synchronized로 검색한 결과 |
|
등록일:2008-03-10 11:04:48 작성자: 제목:javax.swing의 HTMLEditorKit를 사용한 HTML 파싱~ |
|
Java로 HTML를 파싱해야 할때가 가끔 존재한다. 이럴때 사용하면 유용한 소스를 소개한다.
해당 소스는 SWING에 포함되어 있으며, 여타 공개된 파서 이상의 기능을 제공한다.
final StringBuffer plain = new StringBuffer();
HTMLEditorKit.Parser parser;
parser = new ParserDelegator();
try {
parser.parse( new StringReader( stringData), new HTMLEditorKit.ParserCallback() {
public void handleText(char[] data, int pos) {
// Text가 존재할때 호출된다.
plain.append( data);
plain.append( ' ');
}
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
// Tag가 시작될ㅤㄸㅒㅤ 호출된다. 예) <A ...>
}
public void handleEndTag(HTML.Tag t, int pos) {
// Tag가 끝날때 호출된다. 예) </A>
}
public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
// 단일 테그 형태일때 호출된다. <BR/> 같은 테그에서..
}
public void handleComment(char[] data, int pos) { /* NULL */ }
public void handleError(String errorMsg, int pos) { /* NULL */}
}, true);
} catch (IOException e) { e.printStackTrace(); }
필자도 여러개의 파서를 사용해 봤지만 가장 마음에 드는 파서이다.
참고로, 해당 파서는 HTML 3.2 포맷을 기준으로 처리한다. 그래서 가끔 파싱 못하는 테그도 존재한다.
이럴 경우...
less..
public static class ParserHTML extends ParserDelegator {
/**
*
*/
private static final long serialVersionUID = -4814411384900651146L;
private static DTD dtd = null;
public ParserHTML( ) { setDefaultDTD(); }
protected static Synchronized void setDefaultDTD() {
if (dtd == null) {
DTD _dtd = null;
String nm = "html32";
try {
_dtd = DTD.getDTD(nm);
} catch (IOException e) {
System.out.println("Throw an exception: could not get default dtd: " + nm);
}
dtd = createDTD( _dtd, nm);
}
}
public void parse( Reader r,
HTMLEditorKit.ParserCallback cb, boolean ignoreCharSet) throws IOException {
new DocumentParser(dtd).parse(r, cb, ignoreCharSet);
}
};
를 만들어, DTD(bdtd 확장자)를 업데이트 하여 사용할수 있다. 그러면 원하는 결과를 얻을수 있다.
그런데, 문제는 해당 DTD를 구하기가 쉽지 않다는 것이다.
아래 html401.bdtd 파일을 첨부한다. 이 파일을 사용하기 위해서는 classpath가
javax/swing/text/html/parser/dtds
에 저장되어 있어야 DTD.getDTD()를 통해 얻을수 있다.
html401.bdtd
그러나, HTML 4.01를 사용할경우, HTML 3.2 사용시 문제가 되지 않았던 부분에 문제가 발생되는
경우가 있다. 첨부한 html401.bdtd는 Sun에서 배포한 버젼이 아니라, 인터넷을 돌아 다니다 우연히
발견한 것으로 기본으로 포함된 html32.bdtd에 비해 좋은 분석 결과를 얻어 내지는 못하였다.
(기본 Java패키지에는 포함 안되어 있음)
참고하시길~
출처 : http://symlink.tistory.com/19 |
|
|
|
|
|