boostによるxml解析について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ALPI

boostによるxml解析について

#1

投稿記事 by ALPI » 12年前

初めまして。

当方、現在DXライブラリを使ってゲームを作っています。
読み込むデータを保持するファイルの形式としてXMLを考えています。
C++のライブラリであるBoostが良さそうだったのでプログラムに組み込もうとしていますが躓いています。

プログラム抜粋(ヘッダファイルはインクルードしています)

コード:

    using namespace boost::property_tree;

    ptree pt;
    read_xml("test.xml", pt);

	BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("map")) {
        const ptree& child = child_.second;
		const std::string layer_name     = child.get<std::string>("<xmlattr>.name");
		
    }
対象のXMLファイル

コード:

<?xml version="1.0" encoding="UTF-8"?>
<map tileheight="32" tilewidth="32" height="10" width="10" orientation="orthogonal" version="1.0">
<layer height="10" width="10" name="Tile Layer 1">
<data>
<tile gid="1"/>
<tile gid="2"/>
<tile gid="3"/>
</data>
</layer>
</map>
tile要素は10000以上あるので割愛しています。
layer要素は将来的にname="Tile Layer 1"のもの以外にname="Tile Layer 2"のように増やしていくのでBOOST_FOREACHでそれぞれを取得しようと考えています。
私はまずlayer要素のname属性を取得したいです。
tile要素のgid属性は取得できるようになったのですがlayer要素の方ができていません。
ヒントをいただけるとありがたいです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: boostによるxml解析について

#2

投稿記事 by h2so5 » 12年前

コード:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
#include <iostream>

int main() {
    using namespace boost::property_tree;
 
    ptree pt;
    read_xml("test.xml", pt);
 
    BOOST_FOREACH (const ptree::value_type& child_, pt.get_child("map")) {
		if (child_.first == "layer") {
			const ptree& child = child_.second;
			std::cout << child.get<std::string>("<xmlattr>.name") << std::endl;
		}
    }
}
Boost.PropertyTreeは主にJSON向けに最適化されているので、実はXMLの読み込みはあまり得意ではありません。
(読み込めないXMLがあったり、XMLの構造によってはコーディングが面倒)
ちゃんとしたパースを行いたい場合はTinyXML2をお勧めします。

ALPI

Re: boostによるxml解析について

#3

投稿記事 by ALPI » 12年前

返信ありがとうございます。
TinyXML2を使ってみたところ簡単に取得することが出来ました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る