VC++中操作XML(MFC、SDK)_第1页
VC++中操作XML(MFC、SDK)_第2页
VC++中操作XML(MFC、SDK)_第3页
VC++中操作XML(MFC、SDK)_第4页
VC++中操作XML(MFC、SDK)_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、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、2、sdk 里直接调用dom 接口3、sdk 里用智能指针调用这 3 种方法本质上是一样的,区别只不过在于需要编码的多少而已,用ccomptr 可以极大的简化代码,下面是几个例子。例子 stocks.xml : text1 childtext1 这个例子应该包含了xml 最常见的特征了吧?mfcmfc 里可以直接使用dom ,不需要手动添加额外的头文件,只需要在cwinapp:initinstance()里调用coinitialize(null)初始化 com ,在 cwinapp:exitinstance里调用 couninitialize()释放 com 就行了。/读取 xmlccompt

3、r spdoc ; /domspdoc. 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 ;spnodelis

4、t -get_length (&nlen ); /子节点数for (long i = 0; i != nlen ; +i) /遍历子节点ccomptr spnode ;spnodelist -get_item (i, &spnode );processnode (spnode ); /节点处理函数/写入 xmlccomptr spnode ;sprootele -selectsinglenode(olestr (/root/node1 ), &spnode );spnode -put_text (olestr (newtext ); /写入 textsprootele

5、-selectsinglenode(olestr (/root/node2/childnode1/attrib1), &spnode );spnode -put_nodevalue (ccomvariant (olestr (newvalue ); /写入 valueccomptr spnewnode ;spdoc -createnode (ccomvariant (node_element), olestr (childnode3 ), olestr (), &spnewnode ); /创建新节点sprootele -selectsinglenode(olestr (/ro

6、ot/node2 ), &spnode );spnode -appendchild (spnewnode, &spnewnode ); /将新节点加为node2 的子节点spnewnode -put_text (olestr (childtext2 ); /写入新节点textccomqiptr spele = spnewnode ; /注意这里使用ccomqiptrspele -setattribute (olestr (attrib1 ), ccomvariant (olestr (value1 );/给新节点添加属性spdoc -save (ccomvariant (ole

7、str (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 -

8、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 ; /注意属性也是一个ixmldomnodes

9、pnamenodemap-get_item (i, &spnodeattrib );processnode (spnodeattrib );/递归遍历子节点ccomptr spnodelist ;spnode -get_childnodes (&spnodelist );spnodelist -get_length (&nlength );for (long i = 0; i != nlength ; + i)ccomptr spchildnode ;spnodelist -get_item (i, &spchildnode );processnode (spc

10、hildnode );对于 text 这样的节点, get_nodevalue会得到空,要得到text 的话可以遍历子节点(只有一个子节点,它的 nodename为#text , nodetype为 node_text , nodevalue就是 text ) ; 也可以用 get_text直接得到 text ,但是对于这样的节点textchildtext,get_text 会同时得到text 和childtext ,不过这样的节点应该是不允许的。dom 里使用的字符串(bstr) 都是 olestr 类型,默认情况下olestr 是 unicode 字符,mfc 里可以用cole2ct 把

11、lpcolestr转换为 lpctstr 。对于自己定义的xml , 大多数时候不需要遍历,可以通过调用selectnodes 、 selectsinglenode指定 xpath直接读取某个节点或属性:ccomptr spdoc ; /domspdoc. cocreateinstance(clsid_domdocument);variant_bool vb;spdoc -load (ccomvariant (olestr (stocks.xml ), &vb); /加载 xml 文件ccomptr sprootele ;spdoc -get_documentelement(&

12、sprootele ); /根节点ccomptr spnodelist ;ccomptr spnode ;sprootele -selectnodes (olestr (/root/node2/* ), &spnodelist ); /得到 node2 下的所有子节点sprootele -selectsinglenode(olestr (/root/node2/childnode1/attrib1), &spnode ); /得到childnode1 的 attrib1 属性xpath 的语法可以参考xml 文档或 msdn 。sdksdk 中也可以使用智能指针,和mfc 没太

13、大区别,同样很方便,直接给代码:#include #include #import /节点处理函数void processnode (msxml2 :ixmldomnodeptr spnode )std :cout nodename: nodename ;if (spnode -nodetype = node_attribute | spnode -nodetype = node_text )std :cout tnodevalue: nodevalue );std :cout nodetype = node_element)msxml2 :ixmldomnamednodemapptr spn

14、amenodemap = 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 *

15、 argv )coinitialize (null );/读取 xmlmsxml2 :ixmldomdocumentptr spxmldoc ;spxmldoc. createinstance(_uuidof (msxml2 :domdocument30);spxmldoc -load (lstocks.xml );msxml2 :ixmldomelementptr sproot = spxmldoc -documentelement; /根节点msxml2 :ixmldomnodelistptr spnodelist = sproot -childnodes ;for (long i = 0

16、; i != spnodelist -length ; +i) /遍历子节点processnode (spnodelist -item i);/写入 xmlsproot -selectsinglenode(l/root/node1 )-text = lnewtext ;sproot -selectsinglenode(l/root/node2/childnode1/attrib1)-nodevalue = lnewvalue ;msxml2 :ixmldomnodeptr spnewnode = sproot -selectsinglenode(l/root/node2 )-appendchild (spxmldoc -createnode (_variant_t (node_element), lchildnode3 , l); /给 node2 创建新子节点childnode3spnewnode -text = lchildtext2 ;msxml2 :ixmldomelementptr spele =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论