?? 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 + -