一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

vc中的XML編程心得【原創(chuàng)】,懿懿博客

 vavava 2008-04-22
vc中的XML編程心得【原創(chuàng)】
杭州浪子 發(fā)表于 2006-10-18 9:25:27

發(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)的屬性鏈

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    中文字幕亚洲精品乱码加勒比 | 色婷婷国产熟妇人妻露脸| 黄片在线免费观看全集| 国产专区亚洲专区久久| 男女午夜在线免费观看视频| 少妇人妻一级片一区二区三区| 欧美日韩综合在线精品| 91爽人人爽人人插人人爽| 少妇熟女亚洲色图av天堂| 欧美大粗爽一区二区三区| 99久久成人精品国产免费| 中文字幕久久精品亚洲乱码| 搡老熟女老女人一区二区| 激情内射亚洲一区二区三区| 中文字幕乱码亚洲三区| 欧美日韩精品视频在线| 人妻内射在线二区一区| 日韩午夜福利高清在线观看| 最好看的人妻中文字幕| 亚洲综合一区二区三区在线| 精品久久少妇激情视频| 黄色av尤物白丝在线播放网址| 国产精品色热综合在线| 免费在线成人激情视频| 久久中文字人妻熟女小妇| 少妇福利视频一区二区| 国产精品日韩精品一区| 欧美日韩亚洲综合国产人 | 国产一区国产二区在线视频 | 欧美性欧美一区二区三区| 美女被啪的视频在线观看| 久久精品久久精品中文字幕| 日本高清视频在线播放| 日韩中文字幕在线不卡一区| 黄色美女日本的美女日人| 日本 一区二区 在线| 欧美有码黄片免费在线视频| 国产成人亚洲欧美二区综| 欧美日不卡无在线一区| 精品视频一区二区不卡| 中文字幕乱码免费人妻av|