はかせのラボ

私の頭の中を書いていく雑記ブログです

boost XML解析の勉強中

あいさつ

どうも、はかせです。
今回は前回に引き続きXML解析の勉強回です。

前回のをそれとなく簡略化してみた

前回使わせてもらったコードはおそらく
どんなXMLファイルでも表示できることを
目的に作られたプログラムだと思います。

ですが、ゲームで使うデータという限定的なものならば
そこまで厳密な解析は不要だと思います。

というわけで目的に合わせ簡略化したコードがこちら

void BoostTest::show_xml(boost::property_tree::ptree &pt, int indent) 
{
	for (auto &it : pt) 
	{
		//子要素が無いか
		bool no_child = true;
		if (it.second.get_child("").size() > 0) no_child = false;
		//インデントの数だけタブでずらす
		for (int i = 0; i < indent; ++i) 
		{
			std::cout << "\t";
		}
		//要素表示it.firstの中身が要素
		std::cout << "<" << it.first <<  ">";
		//子要素が無ければデータの中身を表示
		if (no_child) 
		{
			std::cout << it.second.data();
		}
		//子要素があれば再帰処理する
		else 
		{
			std::cout << std::endl;
			show_xml(it.second, indent + 1);
			for (int i = 0; i < indent; ++i) 
			{
				std::cout << "\t";
			}
		}
		//要素をしめる
		std::cout << "</" << it.first << ">" << std::endl;
	}
}

やっていることはコメントに書いてある通りです。

前回のプログラムとの大きな違いは
XMLの属性を無視している点です。(厳密には特別に扱ってないだけ)
XMLの属性っていうのは

<tag attr="属性">tag</tag>

こんな感じのものです。

実際にXMLを使ってガチガチにやるなら必要なのでしょうが、
私が頭の中に描いている管理データの中には属性は不要なので外しました。

あとがき

今回は前回作ったものを読んでいく中で
私のやろうとしていることに不要な部分を排除した話でした。

今boostの中のread_xmlの部分を追いかけてるんですけど、
全然理解が追いつかないですw

概要程度ならなんとかわかるんですが、
細かいところでなんでこう処理しているのかとかが
イマイチピンと来てない感じです。
(色んなとこが色んな絡み方しててわけわかめ)

もちろん諦める気はないので読解は進めていきます。
ただ進め方はどうしようかなとは思っています。
というのもやったことの備忘録的な意味合いで始まったこのブログですが、
情報発信するならば少しでも有益なのを出したいという気持ちがあります。
その中でただひたすら「わかんねぇ」っていう記事を出すってのはどうなのかなーと。
(読み手からしたら結果やベストプラクティスが知りたいでしょうし)

他にもこのブログの収益化をするのかとか
色々考えなきゃいけないことも増えてきたので
その辺とも合わせて考えていきたいと思います。

それでは今回はこの辺でノシ