рд╕рдВрдкрддреНрддрд┐ рдкреЗрдбрд╝ рдФрд░ рдЙрд╕рдХреЗ XML рдкрд╛рд░реНрд╕рд░ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдВ

рдЫрд╡рд┐

рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ


рд▓реЗрдЦ рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН:



рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдкреЗрдбрд╝


рд╕рдВрд╕реНрдХрд░рдг 1.41.1 рдореЗрдВ рд╢реБрд░реВ, рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмреВрд╕реНрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХ рдирдпрд╛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдмрдврд╝рд╛рд╡рд╛ :: propetry_tree :: ptree рдЯреНрд░реА рд╕рдВрд░рдЪрдирд╛ред

ptree рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреЗрдбрд╝ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡, рдбреЗрдЯрд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдЖрджреЗрд╢рд┐рдд рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рдирд╛рдо рд╣реИред

рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
struct ptree { data_type data; //   list<pair<key_type, ptree>> children; //     }; 


рдореВрд▓ рд░реВрдк рд╕реЗ, рдПрдХ рд╕рд╛рджреЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ key_type рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрдкрддреНрддрд┐ рдЯреНрд░реА рдЙрджрд╛рд╣рд░рдг


рдЯреНрд░реА рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ, рд▓рд┐рдЦрдиреЗ, рд╕рд╣реЗрдЬрдиреЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ptree рд╕рдВрд░рдЪрдирд╛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЗрд╕ рдкреЗрдбрд╝ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рд╕рд░рд▓ рд╣реИ:
 boost::property_tree::ptree heroTree; heroTree.put("Name", "John"); heroTree.put("Exp", 150); heroTree.put("Inventory.Weapon", "Blue Sword"); heroTree.put("Inventory.Money", 3000); 


рдЪреВрдВрдХрд┐ ptree рдореЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреА рд╣реИ, рдЖрдк рдХрдИ рдЖрдЗрдЯрдо рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдПрдХ рд╣реА рдХреБрдВрдЬреА рд╣реИ:
 heroTree.put("Inventory.Item", "Stone"); heroTree.put("Inventory.Item", "Golden helmet"); heroTree.put("Inventory.Item", "Thomb key"); 


рдХреНрдпрд╛ рдЖрдк рдЙрдк-рд╡реГрдХреНрд╖ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ? рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ:
 boost::property_tree::ptree inventoryTree = heroTree.get_child("Inventory"); inventoryTree.put("Item", "Shield of Honor"); 


рдЖрдЗрдЯрдо рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рднреА рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИ:
 int exp = pt.get<int>("Exp"); std::string weapon = pt.get<std::string>("Inventory.Weapon"); 


рдпрджрд┐ рдЖрдЗрдЯрдо рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЙрд╕ рдорд╛рди рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдЬрд┐рд╕реЗ рдЖрдк рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
 int exp = pt.get<int>("Exp", 0); 


рдпрджрд┐ рдХрдИ рддрддреНрд╡ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рд╕реБрд▓рдЭрд╛рдирд╛ рд╣реЛрдЧрд╛:
 BOOST_FOREACH(auto &v, inventoryTree) { if (v.first == "Item") { std::cout << "Hero has item: " << v.second.get<std::string>("") << std::endl; } } 


XML рдкрд╛рд░реНрд╕рд░


рдкреНрд░реЙрдкрд░реНрдЯреА рдЯреНрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдорд╣рд╛рди рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдмрд┐рд▓реНрдЯ-рдЗрди XML рдФрд░ JSON рдкрд╛рд░реНрд╕рд░ рд╣реИрдВред рдкрд░реНрд╕рд░ рд╕рд╣реА рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рд╕рд╣реА рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ - рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдореИрдВрдиреЗ JSON рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВ XML рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдкреВрд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦреВрдВрдЧрд╛ред

Xml рдкрдврд╝рдиреЗ рдФрд░ xml рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд░рдорд╢рдГ read_xml рдФрд░ write_xml рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
 //XML-   std::string xmlCode = "<ButtonList>\ <Button>B1</Button>\ <Button>B2</Button>\ </ButtonList>"; //  std::stringstream stream(xmlCode); try { boost::property_tree::ptree propertyTree; // XML boost::property_tree::read_xml(stream, propertyTree); // : BOOST_FOREACH(auto &v, propertyTree) { std::cout << "Button is " << v.second.get<std::string>("") << std::endl; } //   propertyTree.put("ButtonList.Button", "B3"); propertyTree.put("ButtonList.Button", "B4"); std::stringstream output_stream; //    boost::property_tree::write_xml(output_stream, propertyTree); // XML   std::string outputXmlCode = output_stream; } catch(boost::property_tree::xml_parser_error) { std::cout<<"XML parser error!"<<std::endl; throw; } 


рдпрджрд┐ рдЖрдкрдХреЛ рдиреЛрдб рд╡рд┐рд╢реЗрд╖рддрд╛ рдкрдврд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЫрджреНрдо рдЙрдкрд╢реАрд░реНрд╖рдХ "<xmlattr>" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 //XML-   std::string xmlCode = "<Data name="Position" x="5" y="5"/>"; //...  XML //  std::string name = propertyTree.get<std::string>("Data.<xmlattr>.name"); int x = propertyTree.get<std::string>("Data.<xmlattr>.x"); int y = propertyTree.get<std::string>("Data.<xmlattr>.y"); 


рдЫрджреНрдо-рд╕рдмрдЯреНрд░реА "<xmlattr>" рдХреЗ рд╕рд╛рде, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд░реЗрдХ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЧрд▓рддреА рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ ButtonList рддрддреНрд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ 4 рдмрдЯрди рддрддреНрд╡ рд╣реИрдВ - рдпреЗ рдРрд╕реЗ рддрддреНрд╡ рд╣реИрдВ рдЬреЛ рдмрдЯрди рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдпрджрд┐ ButtonList рддрддреНрд╡ рдореЗрдВ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ XML рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдП рдЧрдП рдЯреНрд░реА рдореЗрдВ рдмрдЯрди рдХреЗ рд╕рд╛рде 4 рдЙрдкрдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ, рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ ButtonList рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рддреЛ - рдПрдХ рдЖрд╢реНрдЪрд░реНрдп! - рдмрдЯрди рдХреЗ рд╕рд╛рде 4 рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдПрдХ рдФрд░ рд╕рдмрдЯреНрд░реА рдЬреЛрдбрд╝реА рдЬрд╛рддреА рд╣реИ, рдХреБрдВрдЬреА "xmlattr>" рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдХрд╛ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ рдмрдЯрдиреЛрдВ рд╕реЗ рдХреЛрдИ рд╕рдВрдмрдВрдз рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рд╣рдо рд╕реАрдзреЗ рд╕рднреА рдЙрдкрдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдХ рд╕рд╛рде рдмрдЯрди рдХреЗ рд╕рд╛рде рд╣рдо "<xmlattr>" рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рдПрдХ рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред
рдЗрд╕рд▓рд┐рдП, рдЬрдм рдмрд╛рд▓ рдкреЗрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА, рдЬреЛ рдХрд┐ рдЧрдгрдирд╛ рд╕реВрдЪреА рд╕реЗ <xmlattr> рдХреЛ рдмрд╛рд╣рд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
 BOOST_FOREACH(auto &v, propertyTree) { if (v.first == "Button") //   { std::cout << "Button is " << v.second.get<std::string>("") << std::endl; } } 


рдЕрдиреНрдп


XML рдкрд╛рд░реНрд╕рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЙрдкрд░реНрдЯреА рдЯреНрд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ JSON, INI рдФрд░ INFO рдкрд╛рд░реНрд╕рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЙрдирд╕реЗ рдирд┐рдкрдЯрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред

рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рд╣рд┐рддреНрдп рдХреА рд╕реВрдЪреА:


www.boost.org/doc/libs/1_52_0/doc/html/property_tree.html

Source: https://habr.com/ru/post/In168951/


All Articles