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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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:

text1

childtext1

这个例子应该包含了XML最常见的特征了吧?

MFC

MFC里可以直接使用DOM,不需要手动添加额外的头文件,只需要在CWinApp::InitInstance()里调用CoInitialize(NULL)初始化COM,在CWinApp::ExitInstance里调用CoUninitialize()释放COM就行了。//读取XML

CComPtr spDoc;//DOM

spDoc.CoCreateInstance(CLSID_DOMDocument);

VARIANT_BOOL vb;

spDoc->load(CComVariant(OLESTR("stocks.xml")), &vb);//加载XML文件

CComPtr spRootEle;

spDoc->get_documentElement(&spRootEle);//根节点

CComPtr spNodeList;

spRootEle->get_childNodes(&spNodeList);//子节点列表

long nLen;

spNodeList->get_length(&nLen);//子节点数

for(long i =0; i != nLen;++i)//遍历子节点

{

CComPtr spNode;

spNodeList->get_item(i, &spNode);

ProcessNode(spNode);//节点处理函数

}

//写入XML

CComPtr 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 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 spEle = spNewNode;//注意这里使用CComQIPtr

spEle->setAttribute(OLESTR("attrib1"), CComVariant(OLESTR("value1")));//给新节点添加属性spDoc->save(CComVariant(OLESTR("stocks.xml")));

//节点处理函数

void ProcessNode(CComPtr& 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 spNameNodeMap;

spNode->get_attributes(&spNameNodeMap);

long nLength;

spNameNodeMap->get_length(&nLength);

for(long i =0; i != nLength;++i)

{

CComPtr spNodeAttrib;//注意属性也是一个IXMLDOMNode spNameNodeMap->get_item(i, &spNodeAttrib);

ProcessNode(spNodeAttrib);

}

//递归遍历子节点

CComPtr spNodeList;

相关文档
最新文档