XMLパーサー

某t氏(t氏率たかいな・・・)のCPU向けのアセンブラのようななにかを作ってます。
俺が使うのじゃないので命令をxmlで読み込ませようとしたのですが、なかなかに大変でした。
MSXMLを使おうとしたのですが、MSDNが英語だったので避けてほかのをパーサーを探したのですが、結局それを動かすためにおそらくMSDNを読む以上に英語を読むことになったので無駄な足掻きでしたw
やっぱり最近よく思うのですが、どんなものでも正規のマニュアルを読むのが1番近道だとおもいます。適当なサイトをみてなにかやろうとして上手くいかなくて結局オフィシャルみたら普通に書いてあったとかありますからね。


それで、最終的にexpatというパーサーを使いました。ただこのパーサー、日本語の文字コードに対応していないので、あまりお勧めできません。
オフィシャルサイトは以下からです。
http://expat.sourceforge.net/
今回VC*1の無料版を使いました。ただ、初めてだったのでライブラリのパスとかの追加の仕方がわからず、直接VCのライブラリディレクトリなどにライブラリをコピーして使いました。
使い方は付属のレファレンス*2のOverviewを参考にしました。
それによると、4つの関数を並べるだけで90%の機能がつかえるそうです。
自分は以下のような感じで実装しました。*3

char *data1;
FILE *fp;
int eofflag;
size_t len;
XML_Parser parser;

//var init
data1 = (char *) malloc(CONVBUFSIZE);

//file open
fopen_s(&fp, "data.xml", "r");


if((parser = XML_ParserCreate(NULL)) == NULL) {
	printf("parser creation error\n");
	return(-1);
}
XML_SetElementHandler(parser, element_start, element_end);
XML_SetCharacterDataHandler(parser, element_text);

len = fread(buf, sizeof(char),BUFSIZE,fp);
eofflag = feof(fp);
fclose(fp);

if ((XML_Parse(parser, buf, (int)len, eofflag)) == 0) {
	printf("parser error\n");
	return(-1);
}

element_start, element_end, element_textは関数です。適当に宣言しておくと開いてくれます。
なんか開発環境の上で実行するとfread関係でとまってしまうのですが、直接動くと動くので、よしということで(ぉぃぉぃ


それで、このパーサー、上から順番に要素を読み込むようです。もしかしたら違うモードがあるのかもしれませんがそこまでレファレンスを精読する気力もなくそのまま使っています。SAXというのかな?


参考サイト

*1:VisualC++

*2:e.g.C:/Program Files (x86)/Expat 2.0.1/Doc/reference.html

*3:ソースは間違っている可能性が大きいです。信用しないでください。保障もしません。