我把以前寫過的一個例子帖出來,以備以后使用.
第一部分:DOM解析:
概述:DOM解析將會把一個完整的XML文檔讀進來,生成一個結構樹。這樣會要把XML文檔全部都加載到內在中。所以解析起來的速度會要慢一些。
1、如何加載xml文件:
//創建DOM,加載XML文檔
MSXML::IXMLDOMDocumentPtr pCommandDoc;
pCommandDoc.CreateInstance(__uuidof(MSXML::DOMDocument));
pCommandDoc->put_async(VARIANT_FALSE);
pCommandDoc->put_validateOnParse(VARIANT_FALSE);
pCommandDoc->put_resolveExternals(VARIANT_FALSE);
pCommandDoc->put_preserveWhiteSpace(VARIANT_TRUE);
pCommandDoc->load(file.GetBuffer(0));
2、在XML文檔中查找指定的結點:
//找到
MSXML::IXMLDOMNodePtr pRootNode=pCommandDoc->selectSingleNode("root/record");
if (pRootNode==NULL)
{
return ;
}
3、得到XML文檔中,結點的屬性
CString strTemp;
MSXML::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
pRootNode->get_attributes(&pAttrs);
if (pAttrs==NULL)
{
return;
}
MSXML::IXMLDOMNodePtr pRequestTypeAttr=pAttrs->getQualifiedItem("name","");
_bstr_t strRequestType=pRequestTypeAttr->Gettext();
strTemp=strRequestType.operator char *();
4、得到結點的內容
_bstr_t strVisiPort=pNode->Gettext();
5、設置結點的內容
HRESULT hr=pNode->put_text(_bstr_t(m_strGatewayPassword));
6、設置一個屬性內容
IXMLDOMAttribute *pa=NULL;
bstr = SysAllocString(L"屬性1");
pXMLDom->createAttribute(bstr,&pNode);
var = VariantString(L"strin");
pa->put_value(var);
pRoot->setAttributeNode(pa, &pa1);
第二部分、如何使用SAX解析
概述:SAX使用的是加載式的,將會把XML文檔分斷,加載到內存中。使用事件通知的方式,來表示找到結點。好像沒有寫文檔的能力吧。它的速度要比DOM快不少。
使用SAX的時候,就需要重載MSXML4.0中的一個接口ISAXContentHandler。
有幾個函數重載了之后,當找到了結點之后,就會回調這一些函數。