sitelink1 | |
---|---|
sitelink2 | |
sitelink3 | http://1 |
sitelink4 | http://ko |
sitelink5 | http://cafe.naver.com/javacircle.cafe?if...leid=21814 |
sitelink6 | http://sitelink1 |
가끔식.. HTML 문서를 가지고 개발을 할 일이 있습니다.
그럴때 사용할 수 있는것이 HTML Parser 입니다.
HTML Parser 에는 다음과 같이 3가지 정도가 있습니다.
Jtidy (http://jtidy.sourceforge.net ),
NekoHTML (http://people.apache.org/~andyc/neko/doc/index.html)
HTMLParser( http://htmlparser.sourceforge.net)
그중에서.. NekoHTML 을 사용하는 법에 대한 강좌를 할까 합니다.
제가 첨 접한게 이거라서...
홈 페이지 : http://people.apache.org/~andyc/neko/doc/html/
API 문서 : http://people.apache.org/~andyc/neko/doc/html/javadoc/index.html
2007/06/01 현재 최신 버전은 0.9.5 입니다. 그리고 Apache의 Xerces를 필요로 합니다.
Xerces 다운로드: http://www.apache.org/dist/xml/xerces-j/
Xerces2 Java API: http://xml.apache.org/xerces2-j/api.html
neko 실행을 위해서는 다음과 같은 jar 파일이 필요합니다.
nekohtml.jar
xercesImpl.jar
jar 를 CLASSPATH 에 추가하면 준비는 끝난다.
HTML 파서는 일반 파서와 순서가 비슷합니다.
1. 파서 생성 : SAX or DOM
2. 파서 설정 : setFeature, setProperty
3. 파싱 실행 : parse()
4. 결과 반환 : org.w3c.dom.Document
아래 소스를 보시면 사용법을 쉽게 알 수 있을 겁니다.
즐프!!!
Tip 1 : 한글이 포함된 HTML 인 경우.
parser.setProperty("http://cyberneko.org/html/properties/default-encoding", "EUC-KR");
Tip 2 : w3c.dom.Document 을 org.jdom.Document 로 바꾸기
org.w3c.dom.Document document = parser.getDocument();
org.jdom.input.DOMBuilder jdomBuilder = new org.jdom.input.DOMBuilder();
org.jdom.Document jdomDoc = jdomBuilder.build(document);
JDom.printJdomElement(jdomDoc.getRootElement());
================================ TestHTMLDOM2 ================================
package test.parser;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.xalan.templates.OutputProperties;
/**
* This program tests the NekoHTML parser's use of the HTML DOM
* implementation by printing the class names of all the nodes in
* the parsed document.
*
* @author Andy Clark
*
* @version $Id$
*/
public class TestHTMLDOM2 {
//
// MAIN
//
/** Main. */
public static void main(String[] argv) throws Exception {
// Neko HTML Parser
DOMParser parser = new DOMParser();
// Configuring Parser
// 참조 : http://people.apache.org/~andyc/neko/doc/html/settings.html
parser.setFeature("http://cyberneko.org/html/features/augmentations", true);
parser.setProperty("http://cyberneko.org/html/properties/names/elems", "lower");
// 인자로 넘겨받은 파일을 분석하고, 결과를 출력한다.
for (int i = 0; i < argv.length; i++) {
parser.parse(argv[i]);
print(parser.getDocument(), "");
}
} // main(String[])
//
// Public static methods
//
/** Prints a node's class name. */
public static void print(Node node, String indent) {
try {
TransformerFactory tfactory = TransformerFactory.newInstance();
// This creates a transformer that does a simple identity transform,
// and thus can be used for all intents and purposes as a serializer.
Transformer serializer = tfactory.newTransformer();
serializer.setOutputProperty(OutputKeys.METHOD, "xml");
serializer.setOutputProperty(OutputKeys.INDENT, "yes");
//serializer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");
//serializer.setOutputProperty(OutputProperties.S_KEY_INDENT_AMOUNT, "4");
serializer.transform (new DOMSource(node),
new StreamResult(System.out));
} catch (Throwable t) {
t.printStackTrace();
}
} // print(Node)
} // class TestHTMLDOM