回答編集履歴

1

文章推敲

2018/11/08 04:50

投稿

mitama_rs
mitama_rs

スコア165

test CHANGED
@@ -1,6 +1,110 @@
1
- child先頭には属性が含まれていす。
1
+ 問題はptree子要素には属性が含まれているということです。
2
-
2
+
3
- 次のコードようにして、get_childで何を取ってきたのかを出力すると
3
+ 次のコードようにして、get_childで何を取ってきたのかを出力してみました
4
+
5
+
6
+
7
+ ```cpp
8
+
9
+ #include <iostream>
10
+
11
+ #include <string>
12
+
13
+ #include <boost/property_tree/ptree.hpp>
14
+
15
+ #include <boost/property_tree/xml_parser.hpp>
16
+
17
+ #include <boost/foreach.hpp>
18
+
19
+ #include <boost/lexical_cast.hpp>
20
+
21
+
22
+
23
+ struct Book {
24
+
25
+ std::string id;
26
+
27
+ std::string x;
28
+
29
+
30
+
31
+ Book() {}
32
+
33
+
34
+
35
+ Book(const Book& other)
36
+
37
+ : id(other.id), x(other.x) {}
38
+
39
+
40
+
41
+ Book(const std::string& id, const std::string& x)
42
+
43
+ : id(id), x(x) {}
44
+
45
+
46
+
47
+ void print() const
48
+
49
+ {
50
+
51
+ std::cout << id << "," << x << std::endl;
52
+
53
+ }
54
+
55
+ };
56
+
57
+
58
+
59
+
60
+
61
+ void load(const std::string& filename)
62
+
63
+ {
64
+
65
+ using boost::property_tree::ptree;
66
+
67
+
68
+
69
+ std::vector<Book> books;
70
+
71
+
72
+
73
+ ptree pt;
74
+
75
+ read_xml(filename, pt);
76
+
77
+
78
+
79
+ BOOST_FOREACH(const ptree::value_type& child_, pt.get_child("faces.face.features")) {
80
+
81
+ std::cout << child_.first << std::endl;
82
+
83
+ }
84
+
85
+
86
+
87
+ for(auto&& book: books) book.print();
88
+
89
+ }
90
+
91
+ int main(int argc, char *argv[])
92
+
93
+ {
94
+
95
+ load("parts.xml");
96
+
97
+ return 0;
98
+
99
+
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ すると、childのfirstの文字列は次のように出力されます。
4
108
 
5
109
 
6
110
 
@@ -20,9 +124,17 @@
20
124
 
21
125
 
22
126
 
127
+
128
+
129
+
130
+
131
+
132
+
133
+ 一個目の要素は`<xmlattr>`なのでの属性ですが、属性からid属性等を取ろうとして、そんな要素はありませんよと例外が送出されています。
134
+
135
+
136
+
23
- に出力されます
137
+ 雑な解決方法はif文で要素文字列を判定することでしょう。
24
-
25
-
26
138
 
27
139
 
28
140
 
@@ -100,7 +212,11 @@
100
212
 
101
213
  BOOST_FOREACH(const ptree::value_type& child_, pt.get_child("faces.face.features")) {
102
214
 
103
- std::cout << child_.first << std::endl;
215
+ if(auto [tag, data] = child_; tag == "point"){
216
+
217
+ books.emplace_back( data.get<std::string>("<xmlattr>.id"), data.get<std::string>("<xmlattr>.x") );
218
+
219
+ }
104
220
 
105
221
  }
106
222
 
@@ -126,118 +242,4 @@
126
242
 
127
243
 
128
244
 
129
-
130
-
131
- 一個目の要素の属性から属性を取ろうとして、そんな要素はありませんよと例外が送出されています。
132
-
133
-
134
-
135
- 雑な解決方法はif文で要素の文字列を判定することでしょう。
136
-
137
-
138
-
139
- ```cpp
140
-
141
- #include <iostream>
142
-
143
- #include <string>
144
-
145
- #include <boost/property_tree/ptree.hpp>
146
-
147
- #include <boost/property_tree/xml_parser.hpp>
148
-
149
- #include <boost/foreach.hpp>
150
-
151
- #include <boost/lexical_cast.hpp>
152
-
153
-
154
-
155
- struct Book {
156
-
157
- std::string id;
158
-
159
- std::string x;
160
-
161
-
162
-
163
- Book() {}
164
-
165
-
166
-
167
- Book(const Book& other)
168
-
169
- : id(other.id), x(other.x) {}
170
-
171
-
172
-
173
- Book(const std::string& id, const std::string& x)
174
-
175
- : id(id), x(x) {}
176
-
177
-
178
-
179
- void print() const
180
-
181
- {
182
-
183
- std::cout << id << "," << x << std::endl;
184
-
185
- }
186
-
187
- };
188
-
189
-
190
-
191
-
192
-
193
- void load(const std::string& filename)
194
-
195
- {
196
-
197
- using boost::property_tree::ptree;
198
-
199
-
200
-
201
- std::vector<Book> books;
202
-
203
-
204
-
205
- ptree pt;
206
-
207
- read_xml(filename, pt);
208
-
209
-
210
-
211
- BOOST_FOREACH(const ptree::value_type& child_, pt.get_child("faces.face.features")) {
212
-
213
- if(auto [tag, data] = child_; tag == "point"){
214
-
215
- books.emplace_back( data.get<std::string>("<xmlattr>.id"), data.get<std::string>("<xmlattr>.x") );
216
-
217
- }
218
-
219
- }
220
-
221
-
222
-
223
- for(auto&& book: books) book.print();
224
-
225
- }
226
-
227
- int main(int argc, char *argv[])
228
-
229
- {
230
-
231
- load("parts.xml");
232
-
233
- return 0;
234
-
235
-
236
-
237
- }
238
-
239
- ```
240
-
241
-
242
-
243
245
  [Wandboxで実行してみる](https://wandbox.org/permlink/9PhYoL658sBSL5Rq)