增强C++XML解析
Boost C++ XML parsing
我稍微熟悉如何使用boost解析XML,如果XML有3个级别(包括3个级别)。然而,我在以下示例中遇到了问题:
(请忽略XML中稍微缺乏逻辑,因为这是对我无法更改的内容的改编。结构很重要)
<content>
<Room>
<RoomName>Livingroom</RoomName>
<Description>
<Color>Red</Color>
<Size>Small</Size>
</Description>
<Description>
<Color>Blue</Color>
<Size>Big</Size>
</Description>
</Room>
<Room>
<RoomName>Bathroom</RoomName>
<Description>
<Color>Green</Color>
<Size>Medium</Size>
</Description>
</Room>
</content>
我试过这个:
struct Room
{
std::string roomName;
std::string roomColor;
std::string roomSize;
};
void parseRoomsXml(){
boost::property_tree::ptree tree;
boost::property_tree::read_xml("./Rooms.xml", tree);
boost::property_tree::ptree formats = tree.get_child("content");
BOOST_FOREACH( boost::property_tree::ptree::value_type const& f, formats ) {
if( f.first == "Room" ) {
Room s;
s.roomName = f.second.get<std::string>("RoomName");
std::cout<<s.roomName<<std::endl;
const boost::property_tree::ptree & attributes = formats.get_child("Room");
BOOST_FOREACH( boost::property_tree::ptree::value_type const& v, attributes ) {
if (v.first == "Description"){
s.roomColor = v.second.get<std::string>("Color");
s.roomSize = v.second.get<std::string>("Size");
std::cout<< s.roomColor << " " <<s.roomSize;
}
}
}
}
}
结果是第一个房间被正确解析,但第二个房间有第一个房间的描述:
=========================
输出:
Livingroom
红色小型
蓝色大
浴室
红色小型
蓝色大
==============================
预期结果为:
Livingroom
红色小型
蓝色大
浴室
绿色介质
====================================
提前感谢,任何帮助都将不胜感激,因为我正在努力适应助推。
问题似乎出现在以下语句中:const boost::property_tree::ptree&attributes=formats.get_child("房间");
您可以使用以下代码迭代子级:
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
config.get_child("path.to.array_of_objects"))
{
std::cout << "First data: " << v.first.data() << std::endl;
boost::property_tree::ptree subtree = (boost::property_tree::ptree) v.second ;
BOOST_FOREACH(boost::property_tree::ptree::value_type &vs,
subtree)
{
std::cout << "Sub data: " << vs.first.data() << std::endl;
color = vs.second.get<std::string>("Color");
roomSize = vs.second.get<std::string>("Size");
}
}
此代码对我来说运行良好
boost::property_tree::ptree formats = tree.get_child("content");
BOOST_FOREACH( boost::property_tree::ptree::value_type const& f, formats ) {
if( f.first == "Room" ) {
Room s;
s.roomName = f.second.get<std::string>("RoomName");
boost::property_tree::ptree subtree2 = (boost::property_tree::ptree) f.second ;
std::cout<<s.roomName<<std::endl;
BOOST_FOREACH(boost::property_tree::ptree::value_type &v,
subtree2)
{
if(v.first == "Description"){
s.roomColor = v.second.get<std::string>("Color");
s.roomSize = v.second.get<std::string>("Size");
std::cout<< s.roomColor << std::endl<<s.roomSize<<std::endl;
}
}
}
}
相关文章:
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- 在Cmake构建CmakeList.txt中读取/解析XML文件
- 使用 libxml2 解析 XML 文件时缺少元素值
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- 如何使用QXmlStreamReader解析包含对其他XML文件的引用的XML文件
- 如何解析列存储格式的XML文件
- 在 c++ 中将简单的 xml 解析为字符串
- 如何使用 Boost XML 解析器
- 如何解析 xml 响应?
- 如何通过不同的编程语言发送,接收和解析XML消息
- 如何在Qt中解析未知的xml并获取其中的所有属性
- 如何使用 C++ 解析具有参数名称和参数值的 XML
- 在 qt 中解析 XML 并获取树标记结构
- 使用 Boost 属性树解析 SVG (XML)
- 将C++文件解析为 XML 文件
- C++解析nmap xml输出以及类似的Boost xml_parser
- Boost Spirit解析类似XML的语法
- 64位libjingle无法解析登录XML,出现expat错误:error_INVALID_TOKEN
- 需要借助C++函数解析/显示XML序列化