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

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);


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值