のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Boost::Property_tree XML解析

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

さて、今日はXMLの解析並びに記述を行いたいと思います。
もれなく、boostに解析するライブラリがあります。

XML Parse

解析用XMLファイル

<?xml version="1.0" encoding="utf-8"?>

<root>
    <person>
    	<name>山田太郎</name>
    	<address>東京都文京区</address>
    	<gender></gender>
    	<age>42</age>
    </person>
    <person>
    	<name>山田花子</name>
    	<address>兵庫県神戸市</address>
    	<gender></gender>
    	<age>20</age>
    </person>
</root>

解析用ソースコード

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

using namespace std;
using namespace boost::property_tree;

class Person{
public:
	string name;
	string address;
	string gender;
	int age;

	void parseXML(const ptree::value_type &xml){
		name = xml.second.get<std::string>("name");
		address = xml.second.get<std::string>("address");
		gender = xml.second.get<std::string>("gender");
		age = xml.second.get<int>("age");
	}

	void printOut(){
		cout << "名前:" << name << endl;
		cout << "住所:" << address << endl;
		cout << "性別:" << gender << endl;
		cout << "年齢:" << age << endl;
	}
};

int main(int argc, char const *argv[]){
	ptree pt;
	read_xml("test.xml",pt);

	for(const ptree::value_type &person: pt.get_child("root")){
		Person *pt = new Person();
		pt->parseXML(person);
		pt->printOut();
	}
	return 0;
}

はじめに、ptreeを宣言し、tree構造で確保し、read_xmlにて、データを読み込み、格納します。
ptreeはget_childで子を取得することができます。今回はget_childでタグ("root")を取得しています。

ルートの中にあるparsonにてループを実行し、各要素を取得するようにしています。

次にPersonクラスを作成しています。
各属性の値ですが、xml.second.getを利用して取得しています。<>内は利用する型です。
このようにして、xmlを解析することができます。