Tinyxml一一利用tinyxml读取节点元素属性值

有的xml文件中内容是按属性方式写入的,格式示例如下所示:



	
	
	
		
		
	

针对这种格式的xml文件我们可以利用TiXmlAttribute属性进行遍历查找存储,具体实现细节如下:

1、首先我们针对Attr1属性里面的内容,我们可以采用_STL_1MAP_PARAM来存储,如下所示:

/*

	
	

*/
bool CTinyxmlEngine::Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,_STL_1MAP_PARAM&m_param)
{
	TiXmlDocument doc(pszPath);
	if (!doc.LoadFile())
	{
		return false;
	}
	const char*pszXmlName,*pszXmlValue;
	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 (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
			{
				pszXmlName = p_attribute->Name();
				pszXmlValue = p_attribute->Value();
				if (NULL!=pszXmlValue)
				{
					m_param.v_param.push_back(pszXmlName);
					m_param.m_param.insert(map::value_type(pszXmlName,pszXmlValue));
				}
			}
			break;
		}
	}
	return true;
}

同理,如果有多个类似Attr1的属性值存在的话,我们可以采用_STL_2MAP_PARAM参数进行存储,如下所示:

/*

	
	

*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,_STL_2MAP_PARAM&m_param)
{
	TiXmlDocument doc(pszPath);
	if (!doc.LoadFile())
	{
		return false;
	}
	const char*pszXmlName,*pszXmlValue,*pszXmlName1;
	_STL_1MAP_PARAM m_param1;
	TiXmlElement* p_root = doc.RootElement();
	for (TiXmlNode* p_node=p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement())
	{
		pszXmlName = p_node->Value();
		if (pszXmlName!=NULL)
		{
			TiXmlElement* p_element = p_node->ToElement();
			m_param1.m_param.clear();
			m_param1.v_param.clear();
			for (TiXmlAttribute* p_attribute=p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
			{
				pszXmlName1 = p_attribute->Name();
				pszXmlValue = p_attribute->Value();
				if (pszXmlValue!=NULL)
				{
					m_param1.v_param.push_back(pszXmlName1);
					m_param1.m_param.insert(make_pair(pszXmlName1,pszXmlValue));
				}
			}
			if (!m_param1.v_param.empty())
			{
				m_param.v_param.push_back(pszXmlName);
				m_param.m_param.insert(make_pair(pszXmlName,m_param1));
			}
		}
	}
	return true;
}

扩展:我们可以读取多个上述节点,根据需要的节点来获取属性值,比如我们需要获取Attr_1Floor属性值,如下所示:

/*

	
		
		
	

*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode,_STL_2MAP_PARAM&m_param)
{
	TiXmlDocument doc(pszPath);
	if (!doc.LoadFile())
	{
		return false;
	}
	const char*pszXmlName,*pszXmlValue,*pszXmlName1;
	_STL_1MAP_PARAM m_param1;
	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();
				TiXmlElement*p_element = p_node->ToElement();
				m_param1.m_param.clear();
				m_param1.v_param.clear();
				for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next())
				{
					pszXmlName1 = p_attribute->Name();
					pszXmlValue = p_attribute->Value();
					if (NULL!=pszXmlValue)
					{
						m_param1.v_param.push_back(pszXmlName1);
						m_param1.m_param.insert(map::value_type(pszXmlName1,pszXmlValue));
					}
				}
				m_param.v_param.push_back(pszXmlName);
				m_param.m_param.insert(map::value_type(pszXmlName,m_param1));
			}
			break;
		}
	}
	return true;
}

函数示例调用如下:

#include 
#include 
#include "TinyxmlEngine.h"
using namespace std;

void Print_m_param1(_STL_1MAP_PARAM m_param1)
{
	vector::iterator it = m_param1.v_param.begin();
	for (;it!=m_param1.v_param.end();++it)
	{
		cout<<"   "<<*it<<": "<::iterator it = m_param2.v_param.begin();
	for (;it!=m_param2.v_param.end();++it)
	{
		cout<<*it<<":"<::iterator it1 = m_param1.v_param.begin();
		for (;it1!=m_param1.v_param.end();++it1)
		{
			cout<<"   "<<*it1<<": "<::iterator it = m_param3.v_param.begin();
	for (;it!=m_param3.v_param.end();++it)
	{
		cout<<*it<<":"<::iterator it = m_param2.v_param.begin();
		for (;it!=m_param2.v_param.end();++it)
		{
			cout<<"   "<<*it<<":"<::iterator it1 = m_param1.v_param.begin();
			for (;it1!=m_param1.v_param.end();++it1)
			{
				cout<<"      "<<*it1<<": "<

运行结果:

Tinyxml一一利用tinyxml读取节点元素属性值_第1张图片

至此,根据Tinyxml读取xml的text内容及attribute属性操作都描述完成了,在实际的应用过程中,两种文本写入方式往往会结合使用,这就需要我们根据不同的场景需求进行相应的遍历读取,接下来讲讲文本及属性的xml写入

你可能感兴趣的:(C++,Tinyxml)