使用 Boost c++ 解析嵌套标记的 xml

Parsing xml using Boost c++ for nested tags

本文关键字:xml 嵌套 Boost c++ 使用      更新时间:2023-10-16

我正在尝试使用具有以下结构的boost解析xml文件:

<root> 
  <chocos> 
    <choco>
      <color>1</color>
    <companies>
      <comapany>10</company>
      <comapany>11</company>
    </companies>
  </choco>
  <choco>
    <color>2</color>
    <companies>
      <comapany>12</company>
      <comapany>13</company>
    </companies>
   </choco>
 </chocos>
</root>

我需要将其存储在以下类中:

class root_info
{
   public:
      //some members
      std::vector<choco_info> chocos;
}
class choco_info
{
   int color;
   int companies[100];
}

我编写了以下代码,但它显示错误:

没有这样的节点(公司(无法读取 xml 文件>

法典:

  for(const auto& v : pt.get_child("root.chocos"))
  {
     choco_info choco;
     if(v.first == "choco")
     {
        choco.color = v.second.get<unsigned>("color");
        int i = 0;
        for(const auto& v2 : pt.get_child("companies"))
        {
           if( v2.first == "company")
           {
              choco.company[i] = v2.second.get<unsigned>("company");
              i++;
           }
        }
     }
     root.chocos.push_back(choco);
  }

xml无法更改,因为它已提供给我。主要问题在于如何迭代"巧克力"和"公司">

构建代码有助于降低复杂性:

住在科里鲁

#include <boost/property_tree/xml_parser.hpp>
std::string const sample = R"(<root> 
  <chocos> 
    <choco>
      <color>1</color>
    <companies>
      <comapany>10</company>
      <comapany>11</company>
    </companies>
  </choco>
  <choco>
    <color>2</color>
    <companies>
      <comapany>12</company>
      <comapany>13</company>
    </companies>
   </choco>
 </chocos>
</root>)";
using boost::property_tree::ptree;
using companies_t = std::vector<int>;
struct choco_info {
   int color;
   companies_t companies;
};
using chocos_t = std::vector<choco_info>;
struct root_info {
    //some members
    chocos_t chocos;
};
bool read_companies(ptree const& pt, companies_t& into) {
    for (auto& [name,child] : pt)
        if (name == "comapany") // FIXME
            into.push_back(child.get_value<int>());
        else 
            return false;
    return true;
}
bool read_chocos(ptree const& pt, chocos_t& into) {
    for (auto& [name,child] : pt) {
        if (name == "choco") {
            choco_info ci;
            ci.color = child.get("color", -1);
            if (!read_companies(child.get_child("companies"), ci.companies))
                return false;
            into.push_back(std::move(ci));
        } else {
            return false;
        }
    }
    return true;
}
#include <iostream>
int main() {
    ptree pt;
    {
        std::istringstream iss(sample);
        read_xml(iss, pt);
    }
    root_info result;
    bool ok = true;
    try {
        ok = read_chocos(pt.get_child("root.chocos"), result.chocos);
    } catch(std::exception const& e) {
        std::cout << "Exception: " << e.what() << "n";
        ok = false;
    }
    if (ok) {
        std::cout << "Parsed:n";
        for (auto& choco : result.chocos) {
            std::cout << " - color " << choco.color << "n";
            for (int company : choco.companies)
                std::cout << "   * company " << company << "n";
        }
    } else {
        std::cout << "Error in inputn";
    }
}

指纹

Parsed:
 - color 1
   * company 10
   * company 11
 - color 2
   * company 12
   * company 13