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

📄 xmlparse.cpp

📁 sMS 通讯 可免费发手机短信 我之前好好做的工作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	IXMLDOMNamedNodeMap *pTempAttributeMap = NULL;
	IXMLDOMNode *pTempNode;
	if (m_pCurNode == NULL) return FALSE;
	
	m_pCurNode->get_attributes ( &pTempAttributeMap );
	if (pTempAttributeMap == NULL)
	{
		AfxMessageBox ( "Get attributes failed" );
		return FALSE;
	}
	
	m_hResult = pTempAttributeMap->removeNamedItem(
		_com_util::ConvertStringToBSTR(strAttributeName),
		&pTempNode);
	BOOL bRet = XML_SUCCEEDED();
	if ( !bRet )
	{
		AfxMessageBox ( "Remove named item failed" );
	}
	ResetNodePtr ( &pTempAttributeMap );
	ResetNodePtr ( &pTempNode );

	return bRet;
}
/**************************************************************************
* 函数介绍:删除当前元素节点,包括其所有子节点.执行该操作后m_pCurNode
*           指向原元素节点父节点所在的节点层次链表中的第一个,
*           m_pCurNodeList,m_nCurNodeListLength,m_nCurNodeNumber赋相应值.
*           该操作对根元素节点执行无效.  
*
* 返回值  :FALSE:删除操作失败.
*           TRUE:删除操作执行成功.
**************************************************************************/
BOOL CXMLParse::DelElement()
{
	if ( m_pCurNode == NULL ) return FALSE;
	//取当前元素节点的父节点
	//通过其父节点的类型判断当前元素节点是否为根元素节点
	IXMLDOMNode * pParentNode = NULL;
	IXMLDOMNode * pTempCurNode = NULL;
	IXMLDOMNode * pTempNode = NULL;
	
	m_pCurNode->get_parentNode(&pTempCurNode);
	if (pTempCurNode == NULL) return FALSE;
	
	BSTR bszTemp;
	CString strTemp;
	pTempCurNode->get_nodeTypeString(&bszTemp);
	strTemp = CString(bszTemp);
	
	// 如果当前元素节点是根元素节点
	if (strTemp.Compare("document") == 0)
	{
		ResetNodePtr ( &pTempCurNode );
		return FALSE;
	}

	m_hResult = pTempCurNode->removeChild(m_pCurNode,&pTempNode);
	if ( XML_FAILED() )
	{
		ResetNodePtr ( &pTempCurNode );
		ResetNodePtr ( &pTempNode );
		AfxMessageBox ( "Remove child node failed" );
		return FALSE;
	}
	
	pTempCurNode->get_parentNode(&pParentNode);
	if (pParentNode != NULL)
	{
		//m_pCurNodeList赋值
		pParentNode->selectNodes(_com_util::ConvertStringToBSTR("*"),
			&m_pCurNodeList);
		if(m_pCurNodeList != NULL)
		{
			m_pCurNodeList->get_length(&m_nCurNodeListLength);
			m_nCurNodeNumber = 0;
			m_pCurNodeList->get_item(m_nCurNodeNumber,&m_pCurNode);
			m_dwTotalElementNum --;
			return TRUE;
		}
	}

	return FALSE;
}
/**************************************************************************
* 函数介绍:删除当前元素节点的内容,即删除其IXMLDOMText节点(如果有).
*
* 输入参数:strElementValue:CString类型,指明当前元素节点的内容.
* 返回值  :FALSE:执行失败或者没有IXMLDOMText节点.
*           TRUE:执行成功. 
**************************************************************************/
BOOL CXMLParse::DelElementValue()
{
	IXMLDOMNodeList *pTempNodeList = NULL;
	IXMLDOMNode *pTempNode = NULL;
	IXMLDOMNode *pTempNode1 = NULL;
	IXMLDOMNode *pTextNode = NULL;
	long lTemp;
	
	if (m_pCurNode == NULL) return FALSE;
	
	//遍历当前元素节点的所有子节点,找到IXMLDOMText节点(如果有)
	//并将pTextNode指向该节点
	
	m_pCurNode->get_childNodes(&pTempNodeList);
	if ( pTempNodeList != NULL )
	{
		pTempNodeList->get_length(&lTemp);
		for (int i=0;i<lTemp;i++)
		{
			BSTR bszTemp;
			CString strTemp;
			pTempNodeList->get_item((long)i,&pTempNode);
			if (pTempNode != NULL)
			{
				pTempNode->get_nodeTypeString(&bszTemp);
				strTemp = CString(bszTemp);
				if (strTemp.Compare("text") == 0)
					pTextNode = pTempNode;
			}		
		}
	}
	
	BOOL bRet = FALSE;
	//删除找到的IXMLDOMText节点
	if (pTextNode != NULL)
	{
		m_pCurNode->removeChild(pTextNode,&pTempNode1);
		bRet = TRUE;
	}
	
	//释放临时对象
	ResetNodePtr ( &pTempNodeList );
	ResetNodePtr ( &pTempNode );
	ResetNodePtr ( &pTempNode1 );
	ResetNodePtr ( &pTextNode );

	return bRet;
}
/**************************************************************************
* 函数介绍:返回当前元素节点指定属性的值.如果指定属性不存在或者执行错误
*           返回空字符串
*
* 返回值  :指定属性的属性值. 
**************************************************************************/
CString CXMLParse::GetAttributeValue(LPCTSTR strAttributeName, BOOL *pbSuccess/*=NULL*/)
{
	if ( pbSuccess ) *pbSuccess = FALSE;
	CString strAttributeValue("");
	IXMLDOMNamedNodeMap *pTempAttributeMap = NULL;
	IXMLDOMNode * pTempAttributeNode = NULL;
	
	BOOL bRet = TRUE;
	if(m_pCurNode == NULL)
	{
		if ( pbSuccess ) *pbSuccess = FALSE;
		return "";
	}
	
	m_pCurNode->get_attributes ( &pTempAttributeMap );
	if ( pTempAttributeMap != NULL )
	{
		pTempAttributeMap->getNamedItem(_com_util::ConvertStringToBSTR(strAttributeName),
			&pTempAttributeNode);
		if (pTempAttributeNode != NULL)
		{
			VARIANT vtAttributeValue;
			vtAttributeValue.vt = VT_EMPTY;
			pTempAttributeNode->get_nodeValue(&vtAttributeValue);
			strAttributeValue = CString(vtAttributeValue.bstrVal);
		}
		else
			bRet = FALSE;
	}
	else
		bRet = FALSE;

	ResetNodePtr ( &pTempAttributeMap );
	ResetNodePtr ( &pTempAttributeNode );
	if ( pbSuccess ) *pbSuccess = bRet;
	
	if ( bRet )
	{
		return strAttributeValue;
	}
	return "";
}
/**************************************************************************
* 函数介绍:返回当前元素节点的名称. 
*
* 返回值  :CString类型,当前元素节点的名称.
**************************************************************************/
CString CXMLParse::GetElementName(BOOL *pbSuccess/*=NULL*/)
{
	if ( pbSuccess ) *pbSuccess = FALSE;
	CString strElementName("");
	BSTR bszElementName;
	if (m_pCurNode != NULL)
	{
		m_pCurNode->get_nodeName(&bszElementName);
		strElementName = CString(bszElementName);
		if ( pbSuccess ) *pbSuccess = TRUE;
		return strElementName;
	}
	if ( pbSuccess ) *pbSuccess = FALSE;
	
	return "";
}
/**************************************************************************
* 函数介绍:返回当前元素节点的内容.如果当前元素节点没有内容或者其它
*           执行错误则返回空字符串. 
*
* 返回值  :CString类型,当前元素节点的内容.
**************************************************************************/
CString CXMLParse::GetElementValue (BOOL *pbSuccess/*=NULL*/)
{
	if ( pbSuccess ) *pbSuccess = FALSE;
	CString strElementValue("");
	
	IXMLDOMNodeList *pTempNodeList = NULL;
	IXMLDOMNode *pTempNode = NULL;
	long lTemp;
	BOOL bRet = FALSE;
	if (m_pCurNode == NULL)
	{
		if ( pbSuccess ) *pbSuccess = FALSE;
		return "";
	}
	
	//遍历当前元素节点的所有子节点,找到IXMLDOMText节点(如果有)
	//并读出其值.
	m_pCurNode->get_childNodes ( &pTempNodeList );
	if (pTempNodeList == NULL)
	{
		ResetNodePtr ( &pTempNodeList );
		if ( pbSuccess ) *pbSuccess = FALSE;
		return "";
	}

	pTempNodeList->get_length(&lTemp);
	for (int i=0;i<lTemp;i++)
	{
		BSTR bszTemp;
		CString strTemp;
		pTempNodeList->get_item((long)i,&pTempNode);
		if (pTempNode != NULL)
		{
			pTempNode->get_nodeTypeString(&bszTemp);
			strTemp = CString(bszTemp);
			if (strTemp.Compare("text") == 0)
			{
				VARIANT vtElementValue;
				vtElementValue.vt = VT_EMPTY;
				pTempNode->get_nodeValue(&vtElementValue);
				strElementValue = CString(vtElementValue.bstrVal);
				bRet = TRUE;
			}
			ResetNodePtr ( &pTempNode );
		}	
	}

	//释放临时对象
	ResetNodePtr ( &pTempNodeList );
	ResetNodePtr ( &pTempNode );
	if ( pbSuccess ) *pbSuccess = bRet;
	if ( bRet )
	{
		return strElementValue;
	}
	return "";
}
/**************************************************************************
* 函数介绍:在当前元素节点的最后一个子元素节点后插入一个节点.执行该
*           操作后m_pCurNode仍指向原来的元素节点,m_pCurNodeList,
*           m_nCurNodeListLength,m_nCurNodeNumber相应值不变.  
*
* 返回值  :FALSE:插入操作失败.
*           TRUE:插入操作执行成功.
**************************************************************************/
BOOL CXMLParse::InsertChildElement(LPCTSTR strElementName)
{
	IXMLDOMNode *pTempNode = NULL;
	IXMLDOMNode *pTempNode1 = NULL;
	BOOL bRet = FALSE;
	if (m_pCurNode == NULL) goto failed;
	
	VARIANT vtTemp;
	vtTemp.vt=VT_I2;
	vtTemp.iVal = MSXML2::NODE_ELEMENT;
	m_pXMLDOMDoc->createNode(
		vtTemp,
		_com_util::ConvertStringToBSTR(strElementName),
		NULL,&pTempNode);
	
	if (pTempNode != NULL)
	{
		m_hResult = m_pCurNode->appendChild(pTempNode,&pTempNode1);
		if ( XML_SUCCEEDED() )
		{
			bRet = TRUE;
		}
		else
		{
			AfxMessageBox ( "Insert child element failed" );
		}
	}
	
	ResetNodePtr ( &pTempNode );
	ResetNodePtr ( &pTempNode1 );
	if ( !bRet ) goto failed;
	m_dwTotalElementNum ++;
	return TRUE;

failed:
	AfxMessageBox ( "Insert child element failed" );
	return FALSE;
}

/**************************************************************************
* 函数介绍:在当前元素节点链表的末尾插入一个节点.执行该操作后m_pCurNode
*           指向原来元素节点,m_pCurNodeList,m_nCurNodeListLength,
*           m_nCurNodeNumber赋相应值.该操作对根元素节点执行无效.  
*
* 返回值  :FALSE:插入操作失败.
*           TRUE:插入操作执行成功.
**************************************************************************/
BOOL CXMLParse::InsertElement(LPCTSTR strElementName)
{
	BSTR bszElementName = _com_util::ConvertStringToBSTR(strElementName);
	if (m_pCurNode == NULL) return FALSE;

	BOOL bRet = FALSE;
	//取当前元素节点的父节点
	//通过其父节点的类型判断当前元素节点是否为根元素节点
	IXMLDOMNode * pParentNode = NULL;
	IXMLDOMNode * pTempNode = NULL;
	IXMLDOMNode * pTempNode1 = NULL;
	
	m_pCurNode->get_parentNode ( &pParentNode );
	if (pParentNode == NULL)
	{
		ResetNodePtr ( &pParentNode );
		return FALSE;
	}
	
	BSTR bszTemp;
	CString strTemp;
	pParentNode->get_nodeTypeString(&bszTemp);
	strTemp = CString(bszTemp);
	// 如果当前元素节点是根元素节点
	if (strTemp.Compare("document") == 0)
	{
		ResetNodePtr ( &pParentNode );
		return FALSE;
	}
	
	VARIANT vtTemp;
	vtTemp.vt=VT_I2;
	vtTemp.iVal = MSXML2::NODE_ELEMENT;
	m_pXMLDOMDoc->createNode(vtTemp,bszElementName,NULL,&pTempNode);
	if (pTempNode != NULL)
	{
		m_hResult = pParentNode->appendChild(pTempNode,&pTempNode1);
		if ( XML_SUCCEEDED() )
		{
			//m_pCurNodeList赋值
			pParentNode->selectNodes(_com_util::ConvertStringToBSTR("*"),
				&m_pCurNodeList);
			
			//m_nCurNodeListLength重新赋值
			if (m_pCurNodeList != NULL)
			{
				m_pCurNodeList->get_length(&m_nCurNodeListLength);
				bRet = TRUE;
				
			}
		}
	}
	
	ResetNodePtr ( &pParentNode );
	ResetNodePtr ( &pTempNode );
	ResetNodePtr ( &pTempNode1 );
	if ( bRet ) m_dwTotalElementNum ++;
	return bRet;
}

/**************************************************************************
* 函数介绍:设置当前元素节点指定属性的值.也可以用来创建指定属性.
*
* 输入参数:strAttributeName: 指明当前元素节点指定属性的名称.
*           strAttributeValue:指明当前元素节点指定属性的值.
* 返回值  :FALSE:执行失败.
*           TRUE:执行成功. 
**************************************************************************/
BOOL CXMLParse::SetAttributeValue(LPCTSTR strAttributeName, LPCTSTR strAttributeValue)
{
	IXMLDOMNamedNodeMap *pTempAttributeMap = NULL;
	IXMLDOMAttribute *pTempAttribute = NULL;
	IXMLDOMNode *pTempNode = NULL;
	BOOL bRet = FALSE;
	
	if (m_pCurNode == NULL) goto failed;

	m_pCurNode->get_attributes(&pTempAttributeMap);
	if (pTempAttributeMap == NULL)
	{
		ResetNodePtr ( &pTempAttributeMap );
		goto failed;
	}
	
	m_pXMLDOMDoc->createAttribute(_com_util::ConvertStringToBSTR(strAttributeName),&pTempAttribute);
	if ( pTempAttribute != NULL )
	{
		pTempAttribute->put_nodeValue(variant_t(_T(strAttributeValue)));
		pTempAttributeMap->setNamedItem(pTempAttribute, &pTempNode);
		if (pTempNode != NULL)
		{
			bRet = TRUE;
		}
		
	}
	ResetNodePtr ( &pTempAttributeMap );
	ResetNodePtr ( &pTempAttribute );
	ResetNodePtr ( &pTempNode );
	if ( !bRet ) goto failed;
	
	return TRUE;

failed:
	AfxMessageBox ( "Set attribute failed" );
	return FALSE;
}
/**************************************************************************
* 函数介绍:设置当前元素节点的内容.
*
* 输入参数:strElementValue:CString类型,指明当前元素节点的内容.
* 返回值  :FALSE:执行失败.
*           TRUE:执行成功. 
**************************************************************************/
BOOL CXMLParse::SetElementValue(LPCTSTR strElementValue)
{
	BSTR bszElementValue;
	bszElementValue = _com_util::ConvertStringToBSTR(strElementValue);
	if (m_pCurNode != NULL)
	{
		m_hResult = m_pCurNode->put_text(bszElementValue);
		if ( XML_SUCCEEDED() )
			return TRUE;
	}
	
	return FALSE;
}

//
// 当前节点是否有子节点
//
// 备注:好像得出的结果不太对
//
BOOL CXMLParse::Having_ChildNode()
{
	if ( !m_pCurNode ) return FALSE;
	VARIANT_BOOL bHavingChildNode;
	m_hResult = m_pCurNode->hasChildNodes( &bHavingChildNode );
	if ( XML_FAILED() ) return FALSE;
	return ( VARIANT_TRUE == bHavingChildNode );
}

⌨️ 快捷键说明

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