Tinyxml一一利用tinyxml读取四层结点元素

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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值