xml通过四层节点访问才能获取到对应的元素值,这种情况如下所示:
<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<FileRoot>
<!--Setting for FileRoot-->
<!--四级节点-->
<Floor3>
<Floor2_1>
<Floor1_1>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_1>
<Floor1_2>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_2>
</Floor2_1>
<Floor2_2>
<Floor1_1>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_1>
<Floor1_2>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_2>
</Floor2_2>
</Floor3>
</FileRoot>
像这种情况,我们根据上一节讲到的内容,知道可以根据Floor3来查询获取到的节点值,Floor3下的节点元素同样采取_STL_3MAP_PARAM结构体的方式进行存储,实现方式如下:
/*
<FileRoot>
<Floor3>
<Floor2_1>
<Floor1_1>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_1>
<Floor1_2>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_2>
</Floor2_1>
<Floor2_2>
<Floor1_1>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_1>
<Floor1_2>
<Text1>t1</Text1>
<Text2>t2</Text2>
</Floor1_2>
</Floor2_2>
</Floor3>
...
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_3_Floor_Text(const char*pszPath,const char*pszNode/*Floor3*/,_STL_3MAP_PARAM&m_param)
{
TiXmlDocument doc(pszPath);
if (!doc.LoadFile())
{
return false;
}
_STL_1MAP_PARAM m_param1;
_STL_2MAP_PARAM m_param2;
const char*pszXmlValue,*pszXmlName1,*pszXmlName2,*pszXmlName3;
TiXmlElement*p_root = doc.RootElement();
for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
{
pszXmlName1=p_node->Value();
if (strcmp(pszXmlName1,pszNode)==0)
{
TiXmlElement*p_element = p_node->ToElement();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName1=p_node->Value();
TiXmlElement*p_element = p_node->ToElement();
m_param2.m_param.clear();
m_param2.v_param.clear();
for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement())
{
pszXmlName2=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())
{
pszXmlName3=p_node->Value();
pszXmlValue=p_node->ToElement()->GetText();
if (NULL!=pszXmlValue)
{
m_param1.v_param.push_back(pszXmlName3);
m_param1.m_param.insert(map<string, string>::value_type(pszXmlName3,pszXmlValue));
}
}
if (!m_param1.v_param.empty())
{
m_param2.v_param.push_back(pszXmlName2);
m_param2.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName2,m_param1));
}
}
if (!m_param2.v_param.empty())
{
m_param.v_param.push_back(pszXmlName1);
m_param.m_param.insert(map<string,_STL_2MAP_PARAM>::value_type(pszXmlName1,m_param2));
}
}
break;
}
}
return true;
}
函数调用如下:
m_engine.Erase_Param_3AMP(m_param3);
m_engine.Read_XML_3_Floor_Text("Test.xml","Floor3",m_param3);
同理,我们可以获取Floor2节点下的元素值,元素值以_STL_2MAP_PARAM的方式存储
bool CTinyxmlEngine::Read_XML_2Floor_Text(const char*pszPath,const char*pszNode/*Floor3*/,const char*pszNode1/*Floor2*/,_STL_2MAP_PARAM&m_param)
{
_STL_3MAP_PARAM m_param3;
if (Read_XML_3_Floor_Text(pszPath,pszNode,m_param3))
{
map<string,_STL_2MAP_PARAM>::iterator it = m_param3.m_param.find(pszNode1);
if (it!=m_param3.m_param.end())
{
m_param = it->second;
}
}
if (!m_param.v_param.empty())
{
return false;
}
return true;
}
另外,我们还可以获取Floor1节点下的元素值,此时的元素值采用_STL_1MAP_PARAM的方式存储:
bool CTinyxmlEngine::Read_XML_1Floor_Text(const char*pszPath,const char*pszNode,const char*pszNode1,const char*pszNode2,_STL_1MAP_PARAM&m_param)
{
_STL_3MAP_PARAM m_param3;
if (Read_XML_3_Floor_Text(pszPath,pszNode,m_param3))
{
map<string,_STL_2MAP_PARAM>::iterator it= m_param3.m_param.find(pszNode1);
if (it!=m_param3.m_param.end())
{
_STL_2MAP_PARAM m_param2;
m_param2 = it->second;
map<string,_STL_1MAP_PARAM>::iterator it1 = m_param2.m_param.find(pszNode2);
if (it1!=m_param2.m_param.end())
{
m_param = it1->second;
}
}
}
if (m_param.v_param.empty())
{
return false;
}
return true;
}
函数调用如下:
m_engine.Erase_Param_1AMP(m_param1);
m_engine.Read_XML_1Floor_Text("Test.xml","Floor3","Floor2_1","Floor1_1",m_param1);