發(fā)現(xiàn)很多網(wǎng)上的XML資料都是抄襲的很厲害,個人在網(wǎng)上資料的基礎(chǔ)上外加自己最近的一些心得總結(jié)了一下,寫下了以下些內(nèi)容,以便自己以后參考。
----------------------------------
1.XML標(biāo)記都是大小寫敏感的
2.文檔的聲明 <?XML version="1.0" encoding="GB2312" standalone="yes"?> XML標(biāo)記說明它是一個XML文檔,后面兩個屬性值表明了它的版本號和編碼標(biāo)準(zhǔn),standalone取yes表明該文件未引明其他外部XML文件
3.處理命令 格式:<?處理指令名 處理指令信息 ?> <?XML-stylesheet type="text/xsl" href="/yxfqust.xsl" ?>
4.注釋 格式:<!--注釋內(nèi)容--> <!--以下是一個學(xué)生名單--> 注釋應(yīng)注意的問題: 1.注釋不能出現(xiàn)在XML聲明之前; 2.注釋不能出現(xiàn)在標(biāo)記中; 3.注釋中不能出現(xiàn)連續(xù)兩個連字符,即"--" 如:<!--this is a bad document.--do you know!-->; 4.注釋中可包含元素,但元素中不能包含"--"包含的元素解析時被忽略; 5.注釋不能嵌套;
5.元素與標(biāo)記 所有的XML文檔必須有一個根元素。 XML語法規(guī)范要求XML元素屬性值必須用引號引著。 ·格式:<標(biāo)記 屬性名1="值1".......>數(shù)據(jù)內(nèi)容</標(biāo)記> XML元素是可以擴(kuò)展的,它們之間有關(guān)聯(lián),XML元素有簡單的命名規(guī)則: Names can contain letters, numbers, and other characters (元素的名字可以包含子母,數(shù)字和其他字符。) Names must not start with a number or punctuation character (元素的名字不能以數(shù)字或者標(biāo)點(diǎn)符號開頭。) Names must not start with the letters XML (or XML or XML ..) (元素的名字不能以XML(或者XML,XML,XML...)開頭。) Names cannot contain spaces(元素的名字不能包含空格。)
6.語句的寫法 1.所有的標(biāo)記都必須要有一個相應(yīng)的結(jié)束標(biāo)記; 2.所有的XML標(biāo)記都必須合理嵌套; 3.所有XML標(biāo)記都區(qū)分大小寫; 4.所有標(biāo)記的屬性必須用""括起來;
7. 1.XML描述數(shù)據(jù)類型。例如:"King lear"是一個標(biāo)題元素; 2.CSS儲存并控制元素的顯示樣式。例如:標(biāo)題將被以18pt字體顯示 3.script腳本控制元素如何動作。例如:當(dāng)一個title元素"out of stock",將被用紅色顯示。 4.DOM則為腳本和對象的交流提供一個公共平臺,并將結(jié)果顯示在瀏覽器窗口。
8.調(diào)用DTD文件的方法有兩種:
a.直接包含在XML文檔內(nèi)的DTD
你只要在DOCTYPE聲明中插入一些特別的說明就可以了,象這樣:
我們有一個XML文檔:
<?XML version="1.0" encoding="GB2312"?>
<myfile>
<title>XML輕松學(xué)習(xí)手冊</title>
<author>ajie</author>
</myfile>
我們在第一行后面插入下面代碼就可以:
<!DOCTYPE myfile [
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY copyright "Copyright 2001, Ajie.">
]>
b.調(diào)用獨(dú)立的DTD文件
將DTD文檔存為.dtd的文件,然后在DOCTYPE聲明行中調(diào)用,例如,將下面的代碼存為myfile.dtd
<!ELEMENT myfile (title, author)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
然后在XML文檔中調(diào)用,在第一行后插入:
<!DOCTYPE myfile SYSTEM "myfile.dtd">
9.一個很嚴(yán)重的誤區(qū):在寫XML文檔時,不經(jīng)意間把第一句“?”后面的xml寫成了大寫的,導(dǎo)致程序讀寫失敗。應(yīng)當(dāng)引起注意!
10.關(guān)于XML的SDK,vc有自帶的MSXML.H文件,但導(dǎo)入之后發(fā)現(xiàn)有寫方法跟很多書上用的方法不一樣, #i nclude <msxml.h> #import <msxml.dll> named_guids using namespace MSXML; ----- 上面的方法不可取,然后就使用下載的SDK。 #i nclude "C:\Program Files\Microsoft XML Parser SDK\inc\msxml2.h" 再在link中把.lib文件包含進(jìn)來,基本上就能調(diào)用里面的接口函數(shù)了。
下面說一下using namespace MSXML; 使用這個是為了區(qū)分在不同的類里面存在同樣的函數(shù)名或者在不同的函數(shù)里面存在不同的變量名。 反正就是為了防止混淆才使用這個方法的。
11.出錯處理的代碼: IXMLDOMParseError *pErr=NULL; BSTR bstr = NULL;
pDoc->get_parseError(&pErr); pErr->get_reason(&bstr); CString strErr; strErr.Format("Load Failed ! %S", bstr); AfxMessageBox(strErr);
12. 關(guān)于BSTR類,在getElementsByTagName(BSTR tagName, IXMLDOMNodeList **resultList)方法中,tagName假如是CString類型則調(diào)用方法:AllocSysString()
在定義了一個BSTR變量后,要記得釋放它 ::SysFreeString(bsText);
13. hr = pDocument->put_async(VARIANT_FALSE); hr = pDocument->put_validateOnParse(VARIANT_FALSE); hr = pDocument->put_resolveExternals(VARIANT_FALSE);
a)添加子節(jié)點(diǎn)到父節(jié)點(diǎn) pParent->appendChild(pChild, &pNode)
b)創(chuàng)建節(jié)點(diǎn) VARIANT vtype; vtype.vt = VT_I4; V_I4(&vtype) = (int)type; pDoc->createNode(vtype, bstrName, NULL, &pNode);
c)創(chuàng)建元素節(jié)點(diǎn) pDoc->createElement(bstrName,pElement); (pElement)->put_text(bstrText);
d)創(chuàng)建文本子節(jié)點(diǎn),并添加到父節(jié)點(diǎn)中 pDoc->createTextNode(bstrText,&pText); pParent->appendChild(pText,& pNode)
e)創(chuàng)建// Create a processing instruction element. BSTR bstrTarget = SysAllocString(L"xml"); BSTR bstrData = SysAllocString(L"version=‘1.0‘"); pDoc ->createProcessingInstruction(bstrTarget, bstrData, &pProcessingInstruction); SysFreeString(bstrTarget); SysFreeString(bstrData);
f)創(chuàng)建注釋節(jié)點(diǎn) pDoc->createComment(bstrText, &pComment);
g)元素節(jié)點(diǎn)屬性值 得到屬性值 VARIANT v; pEle->getAttribute(bstrName,&v); CString str = v.bstrVal; 設(shè)置屬性值 CComVariant v(str); pEle->setAttribute(bstrName, v);
h)節(jié)點(diǎn)屬性值 VARIANT v; CString str; long mCount; 得到節(jié)點(diǎn)屬性集 hr=pNod->get_attributes(&pNodeMap); hr=pNodeMap->get_length(&mCount); 得到節(jié)點(diǎn)屬性 hr=pNodeMap->getNamedItem(bstrName,&pNode); pNodeMap->get_item(i,&pNode); 得到節(jié)點(diǎn)屬性值 hr=pNode->get_nodevalue(&v); str =v.bstrVal; 刪除節(jié)點(diǎn)屬性 MSXML2::IXMLDOMNode *moldNode; mNodeMape->removeNamedItem(bstrName,&moldNode); if (moldNode!=NULL) moldNode->Release();
i)節(jié)點(diǎn) (1)得到節(jié)點(diǎn)、節(jié)點(diǎn)集 根據(jù)節(jié)點(diǎn)名稱 pDoc->getElementsByTagName(bstrName,&pNodeList); pNodeList->get_item(0,&pNode); 得到子節(jié)點(diǎn)集 hr=pNod->get_childNodes(&mNodeList); long mCount; MSXML2::IXMLDOMNode *pNodeSub; mNodeList->get_length(&mCount); hr=pNode->get_firstChild(&pNodeSub); 刪除子節(jié)點(diǎn)(包含刪除節(jié)點(diǎn)屬性、子節(jié)點(diǎn)、當(dāng)前節(jié)點(diǎn)) 刪除當(dāng)前子節(jié)點(diǎn) pNodeList->get_item(i,&pNode); pNod->removeChild(pNode,&moldNode); moldNode->Release();
(2)根據(jù)節(jié)點(diǎn)得到節(jié)點(diǎn)名稱 pNod->get_nodeName(&bstrName); (3)根據(jù)節(jié)點(diǎn)得到節(jié)點(diǎn)值 VARIANT v; hr=pNod->get_nodevalue(&v);
j)XML文件操作 加載 VARIANT_BOOL status; VARIANT vFileName; (1) pDoc->loadXML(bstrName,&status); (2) V_BSTR(&vFileName) = strFileName.AllocSysString(); V_VT(&vFileName) = VT_BSTR; vResult = pDoc->load(vFileName,&status); 保存 BSTR pBFName = mFileName.AllocSysString(); CComVariant v(pBFName); hr=pDoc->save(v);
BSTR bstr = NULL; pDoc->get_xml(&bstr);
k)錯誤處理 BSTR bstr = NULL; pDoc->get_parseError(&pObjError); pObjError->get_reason(&bstr); AfxMessageBox(_T("Failed to load DOM from books.xml. %S\n"),*bstr);
14. /***************************************************************** //據(jù)有關(guān)文檔介紹,以下一段來移除安全性的問題,但是實(shí)際發(fā)現(xiàn)根本不需要 IObjectSafety *pSafety; DWORD dwSupported, dwEnabled;
if ( SUCCEEDED(iXMLDoc->QueryInterface( IID_IObjectSafety, (void**)&pSafety))) { pSafety->GetInterfaceSafetyOptions( MSXML::IID_IXMLDOMDocument, &dwSupported, &dwEnabled ); pSafety->SetInterfaceSafetyOptions( MSXML::IID_IXMLDOMDocument, dwSupported, 0 ); } *******************************************************************/ iXMLDoc->loadXML(L"<customer><first_name>Don</first_name>" L"<last_name>Hall</last_name></customer>", &tEmpty); iXMLDoc->get_documentElement(&iXMLElm); iXMLElm->get_childNodes(&iXMLChild); iXMLChild->get_item(1,&iXMLItem); iXMLItem->get_xml(&bStr); MessageBox(NULL,bStr,TEXT("Caption"),MB_OK);
15. 使用過程中,有以下幾個方法是經(jīng)常用到的。 iXMLDoc->getElementsByTagName(L"PDATXL",&iXMLList); //查找某個結(jié)點(diǎn) iXMLList->get_length(&iLength_Person); //取得結(jié)點(diǎn)鏈長度 iXMLList->get_item(i,&iXMLNode); //獲取結(jié)點(diǎn)鏈中的某一個結(jié)點(diǎn) iXMLNode->get_firstChild(&iXMLNode2); //選中某個結(jié)點(diǎn)的第一個子結(jié)點(diǎn) iXMLNode->get_lastChild(&iXMLNode2); //選中某個結(jié)點(diǎn)的最后一個子結(jié)點(diǎn) iXMLNode->selectSingleNode(L"姓名",&iXMLNode2); //按名選擇子結(jié)點(diǎn) iXMLNode2->get_text(&bStr); //獲取結(jié)點(diǎn)的內(nèi)容 iXMLNode->get_attributes(&iXMLMap); //獲取節(jié)點(diǎn)的屬性鏈
|