C++ 使用boost读取xml

C++ 使用boost读取xml,c++,xml,boost,C++,Xml,Boost,我按照此链接解析xml。但是,如何在不指定特定密钥的情况下读取整个xml呢?我尝试了下面的代码,但它无法处理它,我得到的错误是没有这样的节点。 代码: const std::string XML_PATH1 = "./test1.xml"; #define ROOTTAG "roottag" boost::property_tree::ptree pt1; boost::property_tree::read_xml( XML_PATH1, pt1); BOOST_FOREACH(boost:

我按照此链接解析xml。但是,如何在不指定特定密钥的情况下读取整个xml呢?我尝试了下面的代码,但它无法处理它,我得到的错误是
没有这样的节点。

代码:

const std::string XML_PATH1 = "./test1.xml";
#define ROOTTAG  "roottag"
boost::property_tree::ptree pt1;
boost::property_tree::read_xml( XML_PATH1, pt1);
BOOST_FOREACH(boost::property_tree::ptree::value_type & node, pt1.get_child(ROOTTAG))
{
    std::string tagname = node.first;
    tagname += ".";
    boost::property_tree::ptree subtree = node.second;
    BOOST_FOREACH( boost::property_tree::ptree::value_type & v, subtree.get_child(node.first.data()))
    {
        //does not enter here
        tagname += v.first.data();
        tagname += ".";
        xmlmap[tagname] = tagvalue;
     }
}
在第二个循环而不是
节点.first.data()
中必须指定什么

请注意,我必须使用
BOOST\u FOREACH
本身并使用相同的方法。 我参考了许多网站,但找不到如何在不指定特定密钥的情况下读取整个xml

另外,如何使用上述方法读取多级xml?

当然,正如我在这里的回答中所说的那样,“我想将其展平成一张地图”看起来是一个徒劳的练习:

但是,由于您似乎有意图,无法编写递归迭代ptree的代码,因此,这里是一个开始:

void flatten(boost::property_tree::ptree const& pt, Flat& xmlmap, std::string const& prefix = "") {
    using namespace boost::property_tree;

    bool has_child_elements = false;
    BOOST_FOREACH (ptree::value_type const& child, pt) {
        has_child_elements |= (child.first != "<xmlattr>");
        flatten(child.second, xmlmap, prefix + "." + child.first);
    }

    if (!has_child_elements) {
        std::string val = pt.get_value("");
        if (!val.empty())
            xmlmap[prefix] = val;
    }
}
void flatten(boost::property_tree::ptree const&pt,Flat&xmlmap,std::string const&prefix=”“){
使用名称空间boost::property_树;
bool有子元素=false;
BOOST_FOREACH(ptree::value_type const&child,pt){
具有| child|=元素(child.first!=“”);
展平(child.second、xmlmap、前缀+“+child.first);
}
如果(!有子元素){
std::string val=pt.get_值(“”);
如果(!val.empty())
xmlmap[prefix]=val;
}
}
当你这样称呼它时:

int main() {
    boost::property_tree::ptree pt;
    boost::property_tree::read_xml("test.xml", pt);

    Flat m;
    flatten(pt.get_child("roottag"), m, "DEMO");

    BOOST_FOREACH(Flat::value_type const& p, m) {
        std::cout << p.first << "\t= '" << p.second << "'\n";
    }
}
intmain(){
boost::property_tree::ptree pt;
boost::property_tree::read_xml(“test.xml”,pt);
平坦m;
展平(pt.get_child(“roottag”),m,“DEMO”);
增压器(扁平::值型常量和p,m){

std::你是否也问过同样的问题。我们需要什么才能得到解脱?你能/只是/显示预期的输入和输出吗?示例如何处理多个同名子项、值在映射中被覆盖或如何将同名子项与逗号分隔的值存储在映射中?使用add而不是put。从我的头。文档可能有助于将数据添加到地图中的扁平化方法,那该怎么办呢?
int main() {
    boost::property_tree::ptree pt;
    boost::property_tree::read_xml("test.xml", pt);

    Flat m;
    flatten(pt.get_child("roottag"), m, "DEMO");

    BOOST_FOREACH(Flat::value_type const& p, m) {
        std::cout << p.first << "\t= '" << p.second << "'\n";
    }
}
DEMO.billTo.<xmlattr>.country   = 'US'
DEMO.billTo.city    = 'Old Town'
DEMO.billTo.name    = 'Robert Smith'
DEMO.billTo.state   = 'PA'
DEMO.billTo.street  = '8 Oak Avenue'
DEMO.billTo.zip = '95819'
DEMO.comment    = 'Hurry, my lawn is going wild!'
DEMO.items.item.<xmlattr>.partNum   = '926-AA'
DEMO.items.item.USPrice = '39.98'
DEMO.items.item.comment = 'Confirm this is electric'
DEMO.items.item.productName = 'Baby Monitor'
DEMO.items.item.quantity    = '1'
DEMO.items.item.shipDate    = '1999-05-21'
DEMO.shipTo.<xmlattr>.country   = 'US'
DEMO.shipTo.city    = 'Mill Valley'
DEMO.shipTo.name    = 'Alice Smith'
DEMO.shipTo.state   = 'CA'
DEMO.shipTo.street  = '123 Maple Street'
DEMO.shipTo.zip = '90952'