用MFC读写xml文件

来源:互联网 发布:大数据技术发展历程 编辑:程序博客网 时间:2024/05/17 04:07

        最近又做了一个新活,解析XML文件 ,除了要读出来文件中元素的所有值,还要能把节点的结构表现出来。写也是同样,根据给定的信息,用xml文件记录它们的基本信息和父子关系。

        做之前首先要下载MSXML4.0 ,安装的时候最好选择用户自定义选项,把SDK也给安上。安装完之后msxml所有相关的库文件应该就已经注册到了系统中了。如果你不放心可以再作以下这些事情:

输入 cd c:windowssystem32 回车。
再输入regsvr32 msxml4.dll 回车。
这时会提示您注册MSXML4 成功。


    然后,在您的代码中添加以下两行代码,这个是必须的,不然你是没有办法用到它提供的接口函数的。
#import 
"c:WindowsSystem32msxml4.dll" 
或#import msxml4.dll
" 

using namespace MSXML2;//这一条语句并不是必须的,不过有了它,就不用再每次使用它的类型的时候加一条MSXML2::了,所以最好加上。

        以下就是我在开发过程中的一些心得了。

        1、添加节点(元素):

         添加节点当然首先要创建一个节点(元素),创建一个元素都是在IXMLDOMDocument或IXMLDOMDocumentPtr上进行创建的,示例代码如下:      

IXMLDOMDocumentPtr write_pDoc;
IXMLDOMDocumentPtr  write_IconPropLeftNode

write_pDoc
->raw_createElement((_bstr_t)(char*)"left"&write_IconPropLeftNode);//((_bstr_t)(char*)转换字符串类型
//raw_createElement和createElement作用相同,只是它们的参数和返回值不同。raw_createElement 将新
//创建的节点的指针作为参数,而createElement 是将创建的节点的指针作为返回值。MSXML中有很多这样的
//接口函数,后面遇到的,都可以这么解释(我认为)

        创建了节点后,把创建的节点添加到他的父亲节点上。

        write_panelNode->appendChild(write_panelPropLeftNode);//write_panelNode父节点
        write_panelPropLeftNode->Puttext(_bstr_t(panelInfo_t.left));//设置该节点的值也就是<Pane>Text</Panel> 中的text


        可以设置节点的属性,也就是<Panel id="1"  type="PANEL">中的“id”和“type”

         write_panelNode->setAttribute("ID",panelInfo_t.iconID);
         write_panelNode->setAttribute("Type","PANEL");

2、查找节点:

        查找节点有很多方法

        (1)查找指定名称的节点:

        pNode = read_panelNode->selectSingleNode(_bstr_t("//Buttons"));  //注意,如果你确定你要查找的节点的名字就是Buttons得话,请一定加上“//”,不然返回的结果会是NULL的。selectSingleNode这个方法返回的是当前指针所指向的节点的所有字节点中第一个匹配的节点。

       (2)查找已知节点的所有指定名称的孩子节点:

       IXMLDOMNodeListPtr pBtnNodeList = NULL;

       pBtnNodeList = read_panelNode->selectNodes(_bstr_t("//Button"));

       return pSelected_Nodes;

        返回结果是panel节点下的所有button节点的节点指针list,如果想要遍历每一个button节点,可以使用 IXMLDOMNodeListPtr 的get_item(int index, IXMLDOMNode* * nodePtr)方法(或者IXMLDOMNode* GETitem(int index))。例子:

        HRESULT hr = pBtnNodeList->get_item(indexBtn, &read_btnNode);

        (3)查找第一个孩子节点:

        IXMLDOMNodePtr pPropNode = NULL;

        pPropNode = read_btnNode->GetfirstChild();

        (4)查找指定节点的所有孩子节点:

        IXMLDOMNodeListPtr pPropChildNodeList = NULL;

        pPropChildNodeList = pPropNode->GetchildNodes();

        得到孩子节点的节点指针list后就可以利用Getitem方法得到每一个孩子节点的指针了。

3、得到属性值

       待续,要工作了` `。。。。。

 

原创粉丝点击