Использование XPATH в C ++ Boost - PullRequest
0 голосов
/ 30 марта 2019

Есть ли способ использования XPATH в boost, похожий на C # (SelectSingleNode () и т. Д.).

Я пытаюсь с boost :: property_tree :: ptree, но он немного отличается от C # / VBA XMLпарсинг.

<?xml version="1.0"?>
<Classes>

  <Class name="first">
   <Elements>
    <ElementA>aa</ElementA>
    <ElementB>bb</ElementB>
   </Elements>
  </Class>

  <Class name="second">
   <Elements>
    <ElementA>cc</ElementA>
    <ElementB>dd</ElementB>
   </Elements>
  </Class>

  <Class name="third">
   <Elements>
    <ElementA>ee</ElementA>
    <ElementB>ff</ElementB>
   </Elements>
  </Class>

</Classes>

Я должен выполнить итерации для этого вида конфигурации и выбрать поддерево на основе атрибута Classes / Class [@name].

Как это сделать с помощью ptree.

1 Ответ

0 голосов
/ 31 марта 2019

Получил несколько хороших ссылок, чтобы понять структуру данных ptree, и оттуда это легко.

Началось отсюда, Повысить дерево свойств: как получить дочерний элемент дочернего дерева с помощью XML-файла

тогда вот, https://akrzemi1.wordpress.com/2011/07/13/parsing-xml-with-boost/

#include <iostream>
#include <string>
#include <boost/property_tree/xml_parser.hpp>
#include <boost/foreach.hpp>
#include <fstream>

int main()
{
  std::string xml = R"(<?xml version="1.0"?>
<Classes>

  <Class name="first">
   <Elements>
    <ElementA>aa</ElementA>
    <ElementB>bb</ElementB>
   </Elements>
  </Class>

  <Class name="second">
   <Elements>
    <ElementA>cc</ElementA>
    <ElementB>dd</ElementB>
   </Elements>
  </Class>

  <Class name="third">
   <Elements>
    <ElementA>ee</ElementA>
    <ElementB>ff</ElementB>
   </Elements>
  </Class>

</Classes>)";

  //std::cout << xml;

  using boost::property_tree::ptree;
  std::stringstream ss(xml);
  ptree p;
  read_xml(ss,p);

  std::ostringstream subTree;
  BOOST_FOREACH( ptree::value_type const& v, p.get_child("Classes") )
  {   
      //if(v.second.get<std::string>("<xmlattr>.name") ==  "first") 
       write_xml(subTree, v.second);
       std::cout << subTree.str();
       std::cout << "\n====================\n";

  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...