📄 wp_exmlnode.cpp
字号:
#include "WP_EXMLNode.h"#include "WP_Utility.h"WP_EXMLNode::WP_EXMLNode(){ m_strXML = ""; m_strName = ""; m_strValue = "";}WP_EXMLNode::WP_EXMLNode(const char* pszName, const char* pszValue){ m_strXML = ""; m_strName = pszName; m_strValue = pszValue;}WP_EXMLNode::~WP_EXMLNode(){ unsigned int i; for(i=0;i<m_Childs.size();i++) delete m_Childs[i]; for(i=0;i<m_Attributes.size();i++) delete m_Attributes[i]; m_Childs.clear(); m_Attributes.clear();}WP_EXMLNode* WP_EXMLNode::AddChild(const char* pszName, const char* pszValue){ WP_EXMLNode *pChild = new WP_EXMLNode(pszName, pszValue); AddChild(pChild); return pChild;}WP_EXMLAttribute* WP_EXMLNode::AddAttribute(const char* pszName, const char* pszValue){ WP_EXMLAttribute *pAttri = new WP_EXMLAttribute(pszName, pszValue); AddAttribute(pAttri); return pAttri;}void WP_EXMLNode::AddChild(WP_EXMLNode *pChild){ //m_Childs.push( pChild ); m_Childs.push_back(pChild); m_strXML = "";}void WP_EXMLNode::RemoveChild(WP_EXMLNode *pNode){ std::vector<WP_EXMLNode*>::iterator iter; for(iter=m_Childs.begin(); iter!=m_Childs.end();) { if( *iter == pNode ) { iter = m_Childs.erase(iter); m_strXML = ""; break; } else { iter++; } }}void WP_EXMLNode::AddAttribute(WP_EXMLAttribute *pAttr){ m_Attributes.push_back( pAttr ); m_strXML = "";}void WP_EXMLNode::RemoveAttribute(WP_EXMLAttribute *pAttr){ std::vector<WP_EXMLAttribute*>::iterator iter; for(iter=m_Attributes.begin(); iter!=m_Attributes.end();) { if( *iter == pAttr ) { iter = m_Attributes.erase(iter); m_strXML = ""; break; } else { iter++; } }}void WP_EXMLNode::SetName(const char *pszName){ m_strName = pszName; m_strXML = "";}void WP_EXMLNode::SetValue(const char *pszValue){ m_strValue = pszValue; m_strXML = "";}void WP_EXMLNode::GetName(std::string &strName){ strName = m_strName;}void WP_EXMLNode::GetValue(std::string &strValue){ strValue = m_strValue;}const char* WP_EXMLNode::GetName(){ if (m_strName.empty()) return ""; return m_strName.c_str();}const char* WP_EXMLNode::GetValue(){ if (m_strValue.empty()) return ""; return m_strValue.c_str();}WP_EXMLNode* WP_EXMLNode::GetChildNode(long index){ // index --- GetChildCount return m_Childs[index];}WP_EXMLNode* WP_EXMLNode::FindChild(const char *pszQuery){ char *pszCursor = strchr(pszQuery, '/'); if (NULL != pszCursor) { string strQueryName; strQueryName.append(pszQuery, 0, pszCursor-pszQuery); for (unsigned int i=0; i<m_Childs.size(); i++) { WP_EXMLNode* pNode = m_Childs[i]; string strName = pNode->GetName(); if ( strcmp_lower(strQueryName, strName) == 0 ) return pNode->FindChild( pszCursor+1 ); } } else { //= 如果用户指定了查询节点名为起始父节点名,则返回起始父节点, //= 与函数名称不一致,这里假定用户不会做这样的查询,因为起始 //= 节点的名称通过节点句柄已经能够直接获得,没有理由再做这样 //= 的查询 string strQueryName = pszQuery; string strName = this->m_strName; if ( strcmp_lower(strQueryName, strName) == 0) return this; for (unsigned int i=0; i<m_Childs.size(); i++) { WP_EXMLNode* pNode = m_Childs[i]; string strName = pNode->GetName(); if ( strcmp_lower(strQueryName, strName) == 0 ) return pNode; } } return NULL;}WP_EXMLAttribute* WP_EXMLNode::GetAttribute(long index){ // index --- GetAttributeCount return m_Attributes[index];}WP_EXMLAttribute* WP_EXMLNode::FindAttribute(const char *pszQuery){// EString sq = szQuery;// int iPos = sq.Findf('@');// if ( iPos < 0 )// return NULL;// if ( iPos == 0 )// {// for (int i=0; i<m_Attributes.size(); i++)// {// EXMLAttribute* pa = m_Attributes[i];// EString s;// pa->GetName( s );// EString sa;// sa=sq.Right(sq.Length()-2);// if ( CompareCase(s,sq) == 0 )// return pa;// }// }// else// {// if ( sq[iPos-1] != '/' )// return NULL;// WP_EXMLNode* pNode = FindChild( sq.Left(iPos-1).Text() );// if ( pNode != NULL )// return pNode->FindAttribute(sq.Right(sq.Length()-iPos-1).Text());// } unsigned int i; for (i=0; i<m_Attributes.size(); i++) { WP_EXMLAttribute* pa = m_Attributes[i]; string strQueryName = pszQuery; string strAttriName = pa->GetName(); if ( strcmp_lower(strQueryName, strAttriName) == 0 ) return pa; } return NULL;}long WP_EXMLNode::GetChildCount(){ return m_Childs.size();}long WP_EXMLNode::GetAttributeCount(){ return m_Attributes.size();}const char *WP_EXMLNode::GetXML(int &nFormatTabs){// if (m_strXML.empty())// ToXML(nFormatTabs); /// 为了格式化控制,每次重新生成 m_strXML = ""; ToXML(nFormatTabs); return m_strXML.c_str();}void WP_EXMLNode::ToXML(int &nFormatTabs){ int nTabs; unsigned int i; m_strXML = "\n"; for (nTabs=0; nTabs<nFormatTabs; nTabs++) m_strXML += "\t"; m_strXML += "<"; m_strXML += m_strName; for (i=0; i<m_Attributes.size(); i++) { WP_EXMLAttribute* pAttri = m_Attributes[i]; std::string s; pAttri->GetXML( s ); m_strXML += " "; m_strXML += s; } if ( m_Childs.size() < 1 && m_strValue.length() < 1 ) { m_strXML += "/>"; return; } m_strXML += ">"; if ( m_Childs.size() < 1 ) { std::string strValue = m_strValue; //= 替换存在先后顺序 replace_all_distinct(strValue, "&", "&"); replace_all_distinct(strValue, "<", "<"); replace_all_distinct(strValue, ">", ">"); m_strXML += m_strValue; } else { nFormatTabs++; for(i=0; i<m_Childs.size(); i++) { WP_EXMLNode* pNode = m_Childs[i]; pNode->ToXML(nFormatTabs); // std::string s; // pNode->GetXML(s); std::string s = pNode->GetXML(nFormatTabs); m_strXML += s; } nFormatTabs--; } m_strXML += "\n"; for (nTabs=0; nTabs<nFormatTabs; nTabs++) m_strXML += "\t"; m_strXML += "</"; m_strXML += m_strName; m_strXML += ">";}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -