日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC++中操作XML(MFC、SDK)

發布時間:2025/4/14 c/c++ 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC++中操作XML(MFC、SDK) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

VC++中操作XMLMFCSDK

XML在Win32程序方面應該沒有在Web方面應用得多,很多Win32程序也只是用XML來存存配置信息而已,而且沒有足夠的好處的話還不如用ini。VC++里操作XML有兩個庫可以用:MSXML和XmlLite。MSXML又細分了兩種接口:DOM和SAX2。XP沒自帶有XmlLite,只自帶有2.x、3.x版的MSXML,不支持SAX2(需要MSXML 4.0以上),所以優先使用DOM。
DOM是以COM形式提供的,VC++里調用DOM可以分3種方法:
1、MFC里用CComPtr調用
2、SDK里直接調用DOM接口
3、SDK里用智能指針調用
這3種方法本質上是一樣的,區別只不過在于需要編碼的多少而已,用CComPtr可以極大的簡化代碼,下面是幾個例子。
例子stocks.xml:

<?xml version="1.0" encoding="utf-8"?>
<root>
<node1>text1</node1>
<node2>
<childnode1 attrib1="value1" attrib2="value2"/>
<childnode2 attrib1="value1" attrib2="value2">childtext1</childnode2>
</node2>
</root>


這個例子應該包含了XML最常見的特征了吧?

MFC
MFC里可以直接使用DOM,不需要手動添加額外的頭文件,只需要在CWinApp::InitInstance()里調用CoInitialize(NULL)初始化COM,在CWinApp::ExitInstance里調用CoUninitialize()釋放COM就行了。

//讀取XML
CComPtr<IXMLDOMDocument> spDoc; //DOM
spDoc.CoCreateInstance(CLSID_DOMDocument);
VARIANT_BOOL vb;
spDoc->load(CComVariant(OLESTR("stocks.xml")), &vb); //加載XML文件
CComPtr<IXMLDOMElement> spRootEle;
spDoc->get_documentElement(&spRootEle); //根節點
CComPtr<IXMLDOMNodeList> spNodeList;
spRootEle->get_childNodes(&spNodeList); //子節點列表
long nLen;
spNodeList->get_length(&nLen); //子節點數
for (long i = 0; i != nLen; ++i) //遍歷子節點
{
CComPtr<IXMLDOMNode> spNode;
spNodeList->get_item(i, &spNode);
ProcessNode(spNode); //節點處理函數
}

//寫入XML
CComPtr<IXMLDOMNode> spNode;
spRootEle->selectSingleNode(OLESTR("/root/node1"), &spNode);
spNode->put_text(OLESTR("newText")); //寫入text
spRootEle->selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"), &spNode);
spNode->put_nodeValue(CComVariant(OLESTR("newValue"))); //寫入value
CComPtr<IXMLDOMNode> spNewNode;
spDoc->createNode(CComVariant(NODE_ELEMENT), OLESTR("childnode3"), OLESTR(""), &spNewNode); //創建新節點
spRootEle->selectSingleNode(OLESTR("/root/node2"), &spNode);
spNode->appendChild(spNewNode, &spNewNode); //將新節點加為node2的子節點
spNewNode->put_text(OLESTR("childtext2")); //寫入新節點text
CComQIPtr<IXMLDOMElement> spEle = spNewNode; //注意這里使用CComQIPtr
spEle->setAttribute(OLESTR("attrib1"), CComVariant(OLESTR("value1")));//給新節點添加屬性
spDoc->save(CComVariant(OLESTR("stocks.xml")));

//節點處理函數
void ProcessNode(CComPtr<IXMLDOMNode>& spNode)
{
CComBSTR bsNodeName;
spNode->get_nodeName(&bsNodeName); //節點名
AfxMessageBox(COLE2CT(bsNodeName));
CComVariant varVal;
spNode->get_nodeValue(&varVal); //節點值
AfxMessageBox(COLE2CT(varVal.bstrVal));

DOMNodeType eNodeType;
spNode->get_nodeType(&eNodeType);
if (eNodeType == NODE_ELEMENT) //只有NODE_ELEMENT類型才能包含有屬性和子節點
{
//遞歸遍歷節點屬性
CComPtr<IXMLDOMNamedNodeMap> spNameNodeMap;
spNode->get_attributes(&spNameNodeMap);
long nLength;
spNameNodeMap->get_length(&nLength);
for (long i = 0; i != nLength; ++i)
{
CComPtr<IXMLDOMNode> spNodeAttrib; //注意屬性也是一個IXMLDOMNode
spNameNodeMap->get_item(i, &spNodeAttrib);
ProcessNode(spNodeAttrib);
}

//遞歸遍歷子節點
CComPtr<IXMLDOMNodeList> spNodeList;
spNode->get_childNodes(&spNodeList);
spNodeList->get_length(&nLength);
for (long i = 0; i != nLength; ++i)
{
CComPtr<IXMLDOMNode> spChildNode;
spNodeList->get_item(i, &spChildNode);
ProcessNode(spChildNode);
}
}
}


對于<tag>text</tag>這樣的節點,get_nodeValue會得到空,要得到"text"的話可以遍歷子節點(只有一個子節點,它的nodeName為"#text",nodeType為NODE_TEXT,nodeValue就是"text");也可以用get_text直接得到"text",但是對于這樣的節點<tag>text<childtag>childtext</childtag></tag>,get_text會同時得到"text"和"childtext",不過這樣的節點應該是不允許的。
DOM里使用的字符串(BSTR)都是OLESTR類型,默認情況下OLESTR是Unicode字符,MFC里可以用COLE2CT把LPCOLESTR轉換為LPCTSTR。
對于自己定義的XML,大多數時候不需要遍歷,可以通過調用selectNodes、selectSingleNode指定XPath直接讀取某個節點或屬性:

CComPtr<IXMLDOMDocument> spDoc; //DOM
spDoc.CoCreateInstance(CLSID_DOMDocument);
VARIANT_BOOL vb;
spDoc->load(CComVariant(OLESTR("stocks.xml")), &vb); //加載XML文件
CComPtr<IXMLDOMElement> spRootEle;
spDoc->get_documentElement(&spRootEle); //根節點

CComPtr<IXMLDOMNodeList> spNodeList;
CComPtr<IXMLDOMNode> spNode;
spRootEle->selectNodes(OLESTR("/root/node2/*"), &spNodeList); //得到node2下的所有子節點
spRootEle->selectSingleNode(OLESTR("/root/node2/childnode1/@attrib1"), &spNode); //得到childnode1的attrib1屬性


XPath的語法可以參考XML文檔或MSDN。

SDK
SDK中也可以使用智能指針,和MFC沒太大區別,同樣很方便,直接給代碼:


#include <iostream>
#include <tchar.h>

#import <msxml3.dll>

//節點處理函數
void ProcessNode(MSXML2::IXMLDOMNodePtr spNode)
{
std::cout << "nodeName: " << spNode->nodeName;
if (spNode->nodeType == NODE_ATTRIBUTE || spNode->nodeType == NODE_TEXT)
std::cout << "\tnodeValue: " << _bstr_t(spNode->nodeValue);
std::cout << std::endl;

if (spNode->nodeType == NODE_ELEMENT)
{
MSXML2::IXMLDOMNamedNodeMapPtr spNameNodeMap = spNode->attributes;
for (long i = 0; i != spNameNodeMap->length; ++i) //遍歷節點屬性
ProcessNode(spNameNodeMap->item[i]);

MSXML2::IXMLDOMNodeListPtr spNodeList = spNode->childNodes;
for (long i = 0; i != spNodeList->length; ++i) //遍歷子節點
ProcessNode(spNodeList->item[i]);
}
}

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
//讀取XML
MSXML2::IXMLDOMDocumentPtr spXMLDoc;
spXMLDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));
spXMLDoc->load(L"stocks.xml");
MSXML2::IXMLDOMElementPtr spRoot = spXMLDoc->documentElement; //根節點
MSXML2::IXMLDOMNodeListPtr spNodeList = spRoot->childNodes;
for (long i = 0; i != spNodeList->length; ++i) //遍歷子節點
ProcessNode(spNodeList->item[i]);

//寫入XML
spRoot->selectSingleNode(L"/root/node1")->text = L"newText";
spRoot->selectSingleNode(L"/root/node2/childnode1/@attrib1")->nodeValue = L"newValue";
MSXML2::IXMLDOMNodePtr spNewNode = spRoot->selectSingleNode(L"/root/node2")->appendChild(
spXMLDoc->createNode(_variant_t(NODE_ELEMENT), L"childnode3", L"")
); //給node2創建新子節點childnode3
spNewNode->text = L"childtext2";
MSXML2::IXMLDOMElementPtr spEle = spNewNode;
spEle->setAttribute(L"attrib1", _variant_t(L"value1")); //添加新屬性
spXMLDoc->save(_variant_t(L"stocks.xml"));

spNewNode.Release();
spEle.Release();
spNodeList.Release();
spRoot.Release();
spXMLDoc.Release();
CoUninitialize();

system("pause");
return 0;
}

?

轉載于:https://www.cnblogs.com/MMLoveMeMM/articles/3157421.html

總結

以上是生活随笔為你收集整理的VC++中操作XML(MFC、SDK)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 美女张开腿让男人桶爽 | 国产图片区 | 欧美日韩成人免费 | 亚洲av人人澡人人爽人人夜夜 | 欧美极品少妇 | 亚洲一区二区三区加勒比 | 在线你懂的视频 | 女儿的朋友在线播放 | av激情在线观看 | 国内自拍一区 | 日韩一区二区欧美 | 黑人巨大精品欧美一区免费视频 | 在线免费观看av的网站 | 亚洲视频一区二区三区 | 无人在线观看的免费高清视频 | 色伊人av | 天堂一区二区三区 | 狠狠干狠狠撸 | 欧美日韩一区二区三区在线视频 | 91精品人妻一区二区三区果冻 | 91在线免费视频观看 | 国产美女极度色诱视频www | 伊人伦理 | 欧美性69| 人妖被c到高潮欧美gay | 亚洲视频999 | 中文字幕第11页 | 熟女少妇在线视频播放 | 色眯眯网| 国产伦精品一区二区三区 | 中文字幕资源网 | 黄色免费看视频 | 国产a免费 | 国产一区二区三区免费看 | 国产小视频在线免费观看 | 久久久com | 波多野结衣av片 | 天天操夜夜操夜夜操 | 国产一在线观看 | 黄色免费观看网站 | 2019国产在线 | 麻豆国产免费 | 久久久久久久影视 | 青娱乐av| 超碰在线9 | 日韩一区二区三区免费在线观看 | 久久久久成人网站 | 亚洲黄色激情视频 | 污网站在线看 | 日韩中文在线字幕 | youjizz欧美| 欧美激情首页 | 成人黄页网站 | 日韩欧美无 | 亚洲草草网 | 欧美体内she精高潮 日韩一区免费 | 亚洲欧美日韩久久 | 男女涩涩 | 午夜三级视频 | 尤物一区二区 | 成人音影| 少妇一晚三次一区二区三区 | 色欲av无码一区二区三区 | 视频在线观看一区二区 | 日韩不卡av| 国产爽爽视频 | 操操干干 | 艳妇乳肉豪妇荡乳 | 成人超碰 | 国产高清一区在线观看 | 佐山爱av在线 | 国产一级一区二区 | 黄色片视频播放 | 欧美爱爱小视频 | 日本成人高清 | 91黄色视屏 | 欧美v日韩 | japanese在线观看 | av大帝在线 | 小婕子伦流澡到高潮h | 久久国产毛片 | 成人午夜久久 | 超碰在线图片 | 天天天天躁天天爱天天碰2018 | 97超碰免费在线观看 | www.日本免费| 欧美又粗又长 | 深夜福利免费在线观看 | 日批的视频 | 新版天堂资源中文8在线 | 国产青青操 | www.日韩 | 色姐| 曰本黄色大片 | 成年人的天堂 | 亚洲电影中文字幕 | 国产精品一区二区三区久久 | 久在操| 亚洲视频精品 |