📄 xmlparse.cpp
字号:
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 + -