主要使用了
#include "boost\property_tree\ptree.hpp"
#include "boost\property_tree\xml_parser.hpp"
XML信息:
<?xml version = '1.0' encoding='UTF-8'?>
<LiToSim>
<ProjectInfo>
<ModuleCurve/>
</ModuleElemType>
</ModuleMaterial>
</ModuleLimits>
<ModuleLoad/>
<Solver SimType="Static" OutDir="./">
<Properties>
<PropGroup Name="Solver Type">
<List Name="Type" Data="Small_Displacement#Small_Displacement#Large_Displacement"/>
</PropGroup>
<PropGroup Name="Solver Control">
<Int Name="Increment_Step" Data="10"/>
<List Name="Converge_Type" Data="Converge_u#Converge_u#Converge_f"/>
<Double Name="Converge_Value" Data="0.001"/>
<List Name="Solver" Data="CG_Iterative#CG_Iterative#WaveFront#Skyline"/>
</PropGroup>
<PropGroup Name="Solver Run">
<Int Name="Output Frequency" Data="1"/>
<Button Name="Output Results" Data="Controls..."/>
<Button Name="Solve" Data="Run..."/>
</PropGroup>
</Properties>
<OutputCtrls>
<List Name="OutputFormat" Data="Both#LiToSim#FerView#Both"/>
<PropGroup Name="Displacement">
<Bool Name="Ux" Data="false"/>
<Bool Name="Uy" Data="false"/>
</PropGroup>
<PropGroup Name="Stress">
<Bool Name="VonMises" Data="true"/>
</PropGroup>
</OutputCtrls>
</Solver>
</LiToSim>
从上面这段XML中提取
代码:
extern void GetOutputFormat(const std::string& filemane)
{
boost::property_tree::ptree pt;
boost::property_tree::read_xml(filemane, pt);
auto LiToSim = pt.get_child("LiToSim");
auto solver = LiToSim.get_child("Solver");
auto output = solver.get_child("OutputCtrls");
std::string name, data;
for (auto i = output.begin(); i != output.end(); ++i)
{
name = i->second.get<std::string>("<xmlattr>.Name");
if (name == "OutputFormat")
{
data = i->second.get<std::string>("<xmlattr>.Data");
auto pos = data.find_first_of("#");
data = data.substr(0, pos);
}
}
}
从上面的代码可以看出,用的最多的是get_child(“模块名”)的函数,这个函数可以找到XML对应的目录位置,采用 for (auto i = output.begin(); i != output.end(); ++i)的循环,对模块下的内容进行遍历,用i->second.getstd::string(".Name")的方法找到对应位置的属性,这里“Name”找出来就是"OutputFormat",然后再找“Data”