xml样式,存在两层才能获取到对应元素的情况,如下所示:
<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<FileRoot>
<!--Setting for FileRoot-->
<Floor1>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1>
</FileRoot>
这种情况,我们可以将Floor1节点看做是如下数据类型
typedef struct
{
vector<string> v_param;
map<string,_STL_1MAP_PARAM> m_param;
}_STL_2MAP_PARAM,*_pSTL_2MAP_PARAM;
这样,我们可以通过函数进行读取
bool CTinyxmlEngine::Read_XML_2Floor_Text(const char*pszPath,_STL_2MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
_STL_1MAP_PARAM m_param1;
const char*pszXmlValue,*pszXmlName1,*pszXmlName2;
TiXmlElement*p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName1=p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param1.m_param.clear();
m_param1.v_param.clear();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName2=p_node->Value();
pszXmlValue=p_node->ToElement()->GetText();
if (NULL!=pszXmlValue)
{
m_param1.v_param.push_back(pszXmlName2);
m_param1.m_param.insert(map<string, string>::value_type(pszXmlName2,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param.v_param.push_back(pszXmlName1);
m_param.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName1,m_param1));
}
}
return true;
}
打印元素值:
void Print_m_param2(_STL_2MAP_PARAM m_param2)
{
vector<string>::iterator it = m_param2.v_param.begin();
for (;it!=m_param2.v_param.end();++it)
{
cout<<*it<<":"<<endl;
_STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];
vector<string>::iterator it1 = m_param1.v_param.begin();
for (;it1!=m_param1.v_param.end();++it1)
{
cout<<" "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;
}
cout<<"======================"<<endl;
}
}
函数调用:
m_engine.Read_XML_2Floor_Text("Test.xml",m_param2);
Print_m_param2(m_param2);
输出结果:
同理,如果存在多个类似节点的话,xml形式如下所示:
<FileRoot>
<Floor1>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1>
...
</FileRoot>
我们需要根据不同的Floor1节点来获取对应的元素,这个时候我们可以这么写:
bool CTinyxmlEngine::Read_XML_1Floor_Text(const char*pszPath,const char*pszNode,_STL_1MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
const char*pszXmlValue,*pszXmlName;
TiXmlElement*p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName=p_node->Value();
if (strcmp(pszXmlName,pszNode)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName=p_node->Value();
pszXmlValue=p_node->ToElement()->GetText();
if (NULL!=pszXmlValue)
{
m_param.m_param.insert(map<string, string>::value_type(pszXmlName,pszXmlValue));
m_param.v_param.push_back(pszXmlName);
}
}
break;
}
}
return true;
}
调用如下:
m_engine.Erase_Param_1AMP(m_param1);
m_engine.Read_XML_1Floor_Text("Test.xml","Floor1",m_param1);