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