⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlnode.cpp

📁 跨操作系统的微型中间件
💻 CPP
字号:
#include "XMLNode.h"

#include "MyAssert.h"

string Repeatchar(char v_char,Int32 v_num)
{
	string temp = "";
	for (Int32 i = 0;i<v_num;i++)
	{
		temp += v_char;
	}
	return temp;
}

XMLNode::XMLNode(string v_NodeText,Int32 v_Depth):m_Depth(v_Depth)
{
	m_Property.clear();
	Int32 len = v_NodeText.length();
	char* cNodeText = new char[len+1];
	memset(cNodeText,0,len+1);
	const char* cNodeTemp = v_NodeText.c_str();
	for (Int32 i=0,j=0;i<len;i++)
	{
		if (!((cNodeTemp[i] == '\t') || (cNodeTemp[i] == '\r') || (cNodeTemp[i] == '\n')))
			cNodeText[j++] = cNodeTemp[i];
	}
	string s_NodeText = cNodeText;
	delete[] cNodeText;
	//parse note
	Int32 iNoteStart = s_NodeText.find("<",0);
	Int32 iNoteEnd = 0;
	if (s_NodeText.substr(iNoteStart,XML_NOTE_BEGIN_LEN) == XML_NOTE_BEGIN_TAG)
	{
		iNoteEnd = s_NodeText.find(XML_NOTE_END_TAG,iNoteStart) + XML_NOTE_END_LEN;
		if (iNoteEnd > 0)
			m_Note = s_NodeText.substr(iNoteStart + XML_NOTE_BEGIN_LEN,iNoteEnd - XML_NOTE_BEGIN_LEN - XML_NOTE_END_LEN);
	}
	//parse name and type
	Int32 iNameStart = s_NodeText.find("<",iNoteEnd);
	Int32 iNameEnd1 = s_NodeText.find(" ",iNameStart);
	Int32 iNameEnd2 = s_NodeText.find(">",iNameStart);
	Int32 iNameEnd = 0;
	m_NodeType = 0;
	if (iNameEnd1 == -1)
		iNameEnd = iNameEnd2;
	else
		iNameEnd = iNameEnd1 > iNameEnd2 ? iNameEnd2 : iNameEnd1;
	if (iNameEnd2 > 0)
	{
		if (s_NodeText.substr(iNameEnd2-1,1) == "/")
			m_NodeType = 1;
	}
	if (m_NodeType == 1 && iNameEnd1 == -1)
		m_NodeName = s_NodeText.substr(iNameStart + 1,iNameEnd - iNameStart - 2);
	else
		m_NodeName = s_NodeText.substr(iNameStart + 1,iNameEnd - iNameStart - 1);
	//parse content
	Int32 iContentStart = s_NodeText.find(">",iNoteEnd);
	Int32 iContentEnd = s_NodeText.find("<",iContentStart);
	if (iContentEnd - iContentStart == 1)
		m_Content = "";
	m_Content = s_NodeText.substr(iContentStart + 1,iContentEnd - iContentStart - 1);
	//parse property
	Int32 iPropertyStart = s_NodeText.find("<",iNoteEnd);
	Int32 iPropertyEnd = s_NodeText.find(">",iPropertyStart);
	string sProperty = s_NodeText.substr(iPropertyStart,iPropertyEnd - iPropertyStart + 1);
	Int32 ieqpos = sProperty.find("=",0);
	while(ieqpos > 0)
	{
		Int32 iSpacePos = sProperty.rfind(" ",ieqpos);
		if (iSpacePos > 0)
		{
			string sPropertyName = sProperty.substr(iSpacePos+1,ieqpos - iSpacePos -1);
			Int32 iPointStart = sProperty.find("\"",ieqpos);
			Int32 iPointEnd = sProperty.find("\"",iPointStart + 1);
			if (iPointStart > 0 && iPointEnd > 0)
			{
				string sPropertyValue = sProperty.substr(iPointStart+1,iPointEnd - iPointStart - 1);
				Property temp;
				temp.PropertyName = sPropertyName;
				temp.PropertyValue = sPropertyValue;
				m_Property.push_back(temp);
			}
		}
		ieqpos = sProperty.find("=",ieqpos + 1);
	}
	//parse child node
	Int32 iNodeStart = iContentEnd;
	string strNodeText = "";
	while (iNodeStart >= 0)
	{
		iNodeStart = s_NodeText.find("<",iNodeStart);
		if (iNodeStart == -1)
			break;
		Int32 iNodeEnd = 0;
		//parse child node note
		Int32 iNoteStart = iNodeStart;
		Int32 iNoteEnd = iNodeStart;
		if (s_NodeText.substr(iNodeStart,XML_NOTE_BEGIN_LEN) == XML_NOTE_BEGIN_TAG)
		{
			iNoteEnd = s_NodeText.find(XML_NOTE_END_TAG,iNodeStart);
			iNodeStart = s_NodeText.find("<",iNoteEnd + 1);
		}
		Int32 iNodeEnd1 = s_NodeText.find(" ",iNodeStart);
		Int32 iNodeEnd2 = s_NodeText.find(">",iNodeStart);
		if (s_NodeText.substr(iNodeEnd2 - 1,1) == "/")
			iNodeEnd = iNodeEnd2 + 1;
		else
		{
			Int32 iNameStart = iNodeStart;
			Int32 iNameEnd = 0;
			if (iNodeEnd1 == -1)
				iNameEnd = iNodeEnd2;
			else
				iNameEnd = iNodeEnd1 > iNodeEnd2 ? iNodeEnd2 : iNodeEnd1;
			string strNodeName = s_NodeText.substr(iNameStart + 1,iNameEnd - iNameStart - 1);
			string strEndTag = "</" + strNodeName + ">";
			iNodeEnd = s_NodeText.find(strEndTag,iNameEnd);
			if (iNodeEnd > 0)
				iNodeEnd += (strNodeName.length() + 3);
			else
			{
				iNodeStart = -1;
				continue;
			}
		}
		strNodeText = s_NodeText.substr(iNoteStart,iNodeEnd - iNoteStart);
		XMLNode* pNode = new XMLNode(strNodeText,m_Depth + 1);
		m_Nodes.push_back(pNode);
		iNodeStart = iNodeEnd;
	}
}

XMLNode::XMLNode(string v_Note,string v_Name,string v_Content,Int32 v_Depth)
{
	m_Note = v_Note;
	m_NodeName = v_Name;
	m_Content = v_Content;
	m_Depth = v_Depth;	
	if (m_Content == "")
		m_NodeType = 1;
	else
		m_NodeType = 0;
}

XMLNode::~XMLNode()
{
	m_Property.clear();
	RemoveAllChildNode();
}

//取得节点注释
string XMLNode::GetNote()
{
	return m_Note;
}

//设置节点注释
Bool XMLNode::SetNote(string v_Note)
{	
	m_Note = v_Note;
	return TRUE;
}

//取得节点名称
string XMLNode::GetName()
{
	return m_NodeName;
}

//设置节点名称
Bool XMLNode::SetName(string v_Name)
{
	Assert(v_Name != "");
	m_NodeName = v_Name;
	return TRUE;
}

//取得节点内容
string XMLNode::GetContent()
{
	return m_Content;
}

//设置节点内容
Bool XMLNode::SetContent(string v_Content)
{
	m_Content = v_Content;
	if (m_Content == "")
		m_NodeType = 0;
	else
		m_NodeType = 1;
	return TRUE;
}

//取得节点属性
string XMLNode::GetProperty(string v_PropertyName)
{
	for (vector<Property>::iterator it = m_Property.begin();it != m_Property.end();it++)
	{
		if (it->PropertyName == v_PropertyName)
			return it->PropertyValue;
	}
	return "";
}

//增加节点属性
Bool XMLNode::AddProperty(string v_PropertyName,string v_PropertyValue)
{
	Bool isExist = FALSE;
	for (vector<Property>::iterator it = m_Property.begin();it != m_Property.end();it++)
	{
		if (it->PropertyName == v_PropertyName)
		{
			isExist = TRUE;
			break;
		}
	}
	if (isExist == FALSE)
	{
		Property temp;
		temp.PropertyName = v_PropertyName;
		temp.PropertyValue = v_PropertyValue;
		m_Property.push_back(temp);
		return TRUE;
	}
	return FALSE;
}

//修改节点属性
Bool XMLNode::ModifyProperty(string v_PropertyName,string v_PropertyValue)
{
	for (vector<Property>::iterator it = m_Property.begin();it != m_Property.end();it++)
	{
		if (it->PropertyName == v_PropertyName)
		{
			it->PropertyValue = v_PropertyValue;
			return TRUE;
		}
	}
	return FALSE;
}

//删除节点属性
Bool XMLNode::RemoveProperty(string v_PropertyName)
{
	for (vector<Property>::iterator it = m_Property.begin();it != m_Property.end();it++)
	{
		if (it->PropertyName == v_PropertyName)
		{
			m_Property.erase(it);
			return TRUE;
		}
	}
	return FALSE;
}

//取得节点文本
string XMLNode::GetNodeText()
{
	string strNodeText = "";
	//note
	if (m_Note != "")
	{
		strNodeText += Repeatchar('\t',m_Depth);
		strNodeText += XML_NOTE_BEGIN_TAG + m_Note + XML_NOTE_END_TAG + '\n';
	}
	//name
	strNodeText += Repeatchar('\t',m_Depth);
	strNodeText += "<" + m_NodeName;
	//property
	for (vector<Property>::iterator it = m_Property.begin();it != m_Property.end();it++)
	{
		strNodeText += " " + it->PropertyName + "=\"" + it->PropertyValue + "\"";		
	}
	if (m_NodeType == 1)
		strNodeText += ">";
	else
		strNodeText += ">";	
	if (m_Nodes.size() != 0)
	{
		if (m_Content != "")
		{
			strNodeText += '\n';
			strNodeText += Repeatchar('\t',m_Depth + 1);
			strNodeText += m_Content;
		}
	}
	else
	{
		strNodeText += m_Content;
	}
	//child node
	//Int32 iii = m_Nodes.size();
	if (m_Nodes.size() != 0)
	{
		strNodeText += '\n';
		for (UInt32 i = 0;i < m_Nodes.size();i++)
		{
			strNodeText += (m_Nodes[i])->GetNodeText();
		}
	}	
	if (m_Nodes.size() != 0)
	{
		//strNodeText += '\n';
		strNodeText += Repeatchar('\t',m_Depth);
		strNodeText += "</" + m_NodeName + ">\n";
	}
	else
	{	
		strNodeText += "</" + m_NodeName + ">\n";
	}
	return strNodeText;
}

//增加子节点
XMLNode* XMLNode::AddChildNode(string v_Note,string v_Name,string v_Content)
{
	XMLNode* pNode = new XMLNode(v_Note,v_Name,v_Content,m_Depth + 1);
	if (pNode != NULL)
	{
		m_Nodes.push_back(pNode);
		return pNode;
	}
	return NULL;
}

//删除子节点(按名字)
Bool XMLNode::RemoveChildNode(string v_Name)
{
	for (XMLNodes<XMLNode*>::iterator it = m_Nodes.begin(); it != m_Nodes.end();it++)
	{		
		if ((*it)->GetName() == v_Name)
		{
			delete *it;
			m_Nodes.erase(it);
			return TRUE;
		}
	}
	return FALSE;
}

//删除子节点(按索引)
Bool XMLNode::RemoveChildNode(Int32 index)
{
	Int32 i = 0;
	for (XMLNodes<XMLNode*>::iterator it = m_Nodes.begin(); it != m_Nodes.end();it++,i++)
	{
		if (i == index)
		{
			delete *it;
			m_Nodes.erase(it);
			return TRUE;
		}
	}
	return FALSE;
}

//删除子节点(按指针)
Bool XMLNode::RemoveChildNode(XMLNode* v_Node)
{
	for (XMLNodes<XMLNode*>::iterator it = m_Nodes.begin(); it != m_Nodes.end();it++)
	{
		if (*it == v_Node)
		{
			delete *it;
			m_Nodes.erase(it);
			return TRUE;
		}
	}
	return FALSE;
}

//删除所有子节点
Bool XMLNode::RemoveAllChildNode()
{
/*
	XMLNodes<XMLNode*>::iterator it = m_Nodes.begin();
	while (it != m_Nodes.end())
	{
		delete *it;
		m_Nodes.erase(it);
	}
*/
	while(!m_Nodes.empty())
	{
		delete *m_Nodes.begin();
		m_Nodes.erase(m_Nodes.begin());
	}
	return TRUE;
}

//取得所有子节点
XMLNodes<XMLNode*> XMLNode::GetChildren()
{
	return m_Nodes;
}

//取得子节点(按索引)
XMLNode* XMLNode::GetChild(Int32 index)
{
	Assert(index >= 0 && (index < (Int32)m_Nodes.size()));
	return m_Nodes[index];
}

//取得子节点(按名字)
XMLNode* XMLNode::GetChild(string v_NodeName)
{
	return m_Nodes.GetNodeByName(v_NodeName);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -