我正在尝试使用 Boost C++ 的 ptree 解析以下 SVG (XML) 标记...
SVG (XML)
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg height="395.275590551181" version="1.1"
viewBox="0 0 757.48031496063 395.275590551181" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink" style="background-color: #ffffff;">
<desc>Some Description</desc>
<g visibility="hidden" pointer-events="all">
<rect x="0" y="0" width="100%" height="100%" fill="none" />
</g>
<g>
<path d="M 5 56 L 5 14 L 8 11 L 34 11 Z" />
<path d="M 10 100 L 10 140 L 89 131 L 324 2 Z" />
</g>
<g>
<path d="M 20 130 L 1 1 L 89 130 L 34 2 Z" />
</g>
</svg>
C++ 代码:
typedef boost::property_tree::ptree::value_type vt;
boost::property_tree::ptree root;
read_xml("My_SVG.svg", root);
BOOST_FOREACH (vt const &nodes, root.get_child("svg")) {
//only action on g's and not desc, comments, etc.
if(nodes.first=="g"){
boost::property_tree::ptree g = nodes.second;
//only action on g's that contain paths, not g->rect, for example.
if(g.count("path") != 0){
BOOST_FOREACH (vt const &p, g.get_child("path")) {
std::cout << p.second.get("d", "false") << std::endl;
}
}
}
}
输出:
M 5 56 L 5 14 L 8 11 L 34 11 Z
M 20 130 L 1 1 L 89 130 L 34 2 Z
问题:
它编译得很好,但它没有收到M 10 100 L 10 140 L 89 131 L 324 2 Z
条目。为什么不BOOST_FOREACH
通过每个步骤<path>
的第二步cout
。