Wikipediaからリンクを抜き出す.

http://download.wikimedia.org/からダウンロードできるXMLファイルからタイトルとそのタイトルからのリンク(今のところリンクというよりも[[*]]の部分)を取り出すプログラム

追記:
とりあえず,タイトルにauto_incrementなIDをつけてDBに吐いたのだが,列数が80万近くあるのでメインページの30万項目にくらべて50万近く余計なページ(画像ファイル,ノートページ,リダイレクトページなど)を拾っているので何とかしないと.

import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class Test extends DefaultHandler{
	boolean isTitle;
	boolean isText;
	StringBuilder sb;
	public static void main(String[] args){
		try{
			SAXParserFactory spfactory = SAXParserFactory.newInstance();
			SAXParser parser = spfactory.newSAXParser();
			parser.parse(new File("C:/Documents and Settings/Administrator/My Documents/研究資料/wikipedia_data/jawiki.xml"), new Test());
		}catch (Exception e) {
			e.printStackTrace();
		}
	}
	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		if(isTitle){
			System.out.println("title:"+new String(ch, start, length));			
		}else if(isText){
			String text = new String(ch, start, length);
			sb.append(text);
		}
	}
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		if(qName.equals("title")){
			isTitle = true;
		}
		if(qName.equals("text")){
			sb = new StringBuilder();
			isText = true;
		}
	}
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		if(qName.equals("title")){
			isTitle = false;
		}
		if(qName.equals("text")){
			String str = sb.toString();
			str = extractLink(str);
			System.out.println(str);
			sb = null;
			isText = false;
		}
	}
	private String extractLink(String str){
		//TODO リダイレクトページや曖昧性回避サイトの処理
		//TODO <nowiki></nowiki>などへの対応
		Pattern pattern = Pattern.compile("\\[\\[.+?]\\]");
		Matcher matcher = pattern.matcher(str);
		StringBuilder sb = new StringBuilder();
		while(matcher.find()){
			String link = matcher.group();
			sb.append(link);
		}
		return sb.toString();
	}
}