C++下利用CMarkup来解析xml文件46

    昨天要实现一个从xml文件中读取摄像头IP和ID的功能,再晚上搜索了下,有CMarkup和TinyXml等相应的类库,就选择了CMarkup。

第一步 配置CMarkup 

网址贴上:CMarkup,点击下载即可。下载完毕后,将其中的Markup.h添加到工程中的附加库中去,再将Markup.cpp添加到你的项目中,然后在main.cpp中包含头文件#include”Markup.h",这是整个配置流程。

可能出现编译不了的错误,解决的方法在Markup.cpp最前面include "stdafx.h",或者关闭预编译。

第二步 使用CMarkup

1、创建XML

        CMarkup xml_Path;                        //声明一个xml对象
        xml_Path.AddElem(_T("LEADMAP"));                //添加一个标签
        xml_Path.IntoElem();                        //进去指针指向的当前标签
        xml_Path.AddElem(_T("ROUTE"));                    //添加一个标签
        xml_Path.SetAttrib(_T("user_name"),m_strUserName);        //对指针指向标签添加属性
        xml_Path.SetAttrib(_T("route_name"),m_strPatrolRouteName);
        xml_Path.SetAttrib(_T("start_time"),sTime);
        xml_Path.OutOfElem();                         //回到上级标签
        xml_Path.Save(_T("c:\\test.xml"));                //保存文件

    创建后-------------------------------------------------------

        <LEADMAP>
        <ROUTE user_name="NULL" route_name="NULL" start_time="6:6:01"/>
        </LEADMAP>



2、修改XML
        xml.load(_T("c:\\test.xml"))            //加载xml文件,成功返回true
        xml.ResetMainPos();             //将指针定义到第一个顶级标签上一个位置,注:一个标准的xml文件只有一个顶级标签
        xml.FindElem();                     //将指针定义到第一个顶级标签
        xml.IntoElem();                 //进入LEADMAP
        xml.AddChildElem( _T("TIME"),szTime );        //向<LEADMAP>的子标签中(也就是ROUTE)中添加标签
        xml.AddChildElem( _T("X"), PointX);
        xml.AddChildElem( _T("Y"),PointY );
        xml.AddChildElem( _T("SPEED"),strSpeed );
        xml.OutOfElem();                 //回到LEADMAP
        xml.Save(_T("c:\\test.xml"));            //保存
    
    修改后-----------------------------------------------------------

            <LEADMAP>
            <ROUTE user_name="NULL" route_name="NULL" start_time="6:6:01">
            <POINT>
            <TIME>06:03:01</TIME>
            <X>25942.839</X>
            <Y>38936.131</Y>
            <SPEED>0.00</SPEED>
            </POINT>
            </ROUTE>
            </LEADMAP>

3、读取xml

                xml.Load(_T("c:\\test.xml"));
                xml.ResetMainPos();            //将指针定义到第一个顶级标签上一个位置
                xml.FindChildElem(_T("ROUTE"));        //将指针定义到子标签为<ROUTE>的标签上
                xml.IntoElem();                //进入指针指向的标签
                xml.FindChildElem(_T("POINT"));        //将指针定义到子标签为<POINT>的标签上
                xml.IntoElem();                //进入指针指向的标签
                xml.FindChildElem(_T("X"));        //将指针定义到子标签为<X>的标签上
                x=xml.GetChildData();            //获取当前指向标签的值
                xml.OutOfElem();            //回到父标签,也就是<POINT>
                xml.IntoElem();                //进入当前标签,也就是<POINT>
                xml.FindChildElem(_T("Y"));        //将指针定义到子标签为<Y>的标签上
                y=xml.GetChildData();            //获取当前指向标签的值
                xml.OutOfElem();            //回到父标签,也就是<POINT>


    获得的值------------------------------------------------------------

        x=25942.839;
        y=38936.131;


4、遍历标签


        xml.ResetMainPos();
        int count = 0;
        while (xml.FindChildElem())
        {
            count++;
        }
        for (int i = 0;i<count;i++)
        {
            xml.FindChildElem();
        }

        经过这两次遍历可以是指针指向最后一个二级标签
在安装配置中可能会出现一些问题,(1)error LNK2019: 无法解析的外部符号 "public: __cdecl CMarkup::~CMarkup(void)" (??1CMarkup@@QAA@XZ),解决方法如果是用CMarkup库的话,看看lib连接的是不是对;如果直接用的源文件的话,把CPP文件加到你现在的工程里。 (2)出现一个MFC的错误,提示建议不用使用MD(d),解决方法是:在配置属性——>常规,设置MFC使用为共享DLL中使用MFC。(3)出现不存在“const char ”转换到“MCD_CSTR”的适当构造函数,解决方法:在配置属性——>常规,设置字符集为多字节字符集即可。(4)错误描述:fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"”?


错误分析:
       此错误发生的原因是编译器在寻找预编译指示头文件(默认#include "stdafx.h")时,文件未预期结束。没有找到预编译指示信息的头文件"stdafx.h"。
    (因为工程中的每个cpp文件属性默认都是使用预编译头(/YU)的,但是添加的第三方文件并没有 #include "stdafx.h" 预编译指示头,所以编译器在此cpp文件中一直到末尾都没有找到它)
       我的这个问题发生于我通过添加文件的方式,向MFC内添加现有的一大坨.h和.cpp文件。这些.h和.cpp文件是属于标准C++的开源源代码范畴,与MFC无更深层次的关系。

解决方式:
一.
1) 在解决方案资源管理器中,右击相应的.cpp文件,点击“属性”
2) 在左侧配置属性中,点开“C/C++”,单击“预编译头”
3) 更改右侧第一行的“创建/使用预编译头”,把选项从“使用预编译头(/Yu)”改成“不使用预编译头”
4) 注:每一个报错的.cpp都要如此更改哦~辛苦一下呗~


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC解析XML--使用CMarkup解析XML (一) 先讲一下XML中的物殊字符,手动填写时注意一下。 字符 字符实体 & &或&#38; ' &apos;或' > >或> < <或&< " "或" (二) CMarkup类的源代码。 这是目前的最新版本; 取出里面的Markup.cpp和Markup.h,导入你的工程里面,CMarkup类就可以用了; (三) 创建一个XML文档。 CMarkup xml; xml.AddElem( "ORDER" ); xml.AddChildElem( "ITEM" ); xml.IntoElem(); xml.AddChildElem( "SN", "132487A-J" ); xml.AddChildElem( "NAME", "crank casing" ); xml.AddChildElem( "QTY", "1" ); xml.Save("c:\\UserInfo.xml"); 效果如下: <ORDER> <ITEM> <SN>132487A-J</SN> <NAME>crank casing</NAME> <QTY>1</QTY> </ITEM> </ORDER>(四) 浏览特定元素CMarkup xml; xml.Load("UserInfo.xml");while ( xml.FindChildElem("ITEM") ) { xml.IntoElem(); xml.FindChildElem( "SN" ); CString csSN = xml.GetChildData(); xml.FindChildElem( "QTY" ); int nQty = atoi( xml.GetChildData() ); xml.OutOfElem(); }(五)增加元素和属性添加在最后面,使用的是AddElem;添加在最前面,使用InsertElem。CMarkup xml;xml.Load("c:\\UserInfo.xml"); xml.AddElem( "ORDER" ); xml.IntoElem(); // 进入 ORDER xml.AddElem( "ITEM" ); xml.IntoElem(); // 进入 ITEM xml.AddElem( "SN", "4238764-A" ); //添加元素 xml.AddElem( "NAME", "bearing" );//添加元素 xml.AddElem( "QTY", "15" );//添加元素 xml.OutOfElem(); // 退出 ITEM xml.AddElem( "SHIPMENT" ); xml.IntoElem(); // 进入 SHIPMENT xml.AddElem( "POC" );//添加元素 xml.SetAttrib( "type", "non-emergency");//添加属性 xml.IntoElem(); // 进入 POC xml.AddElem( "NAME", "John Smith");//添加元素 xml.AddElem( "TEL", "555-1234");//添加元素 xml.Save("c:\\UserInfo.xml"); 效果如下: <ORDER> <ITEM> <SN>132487A-J</SN> <NAME>crank casing</NAME> <QTY>1</QTY> </ITEM> <ITEM> <SN>4238764-A</SN> <NAME>bearing</NAME> <QTY>15</QTY> </ITEM> <SHIPMENT> <POC type="non-emergency"> <NAME>John Smith</NAME> <TEL>555-1234</TEL> </POC> </SHIPMENT> </ORDER>(六) 修改元素和属性 如将POC中的属性type改成:change; 元素TEL改成:123456789 CMarkup xml; if (xml.Load("UserInfo.xml")) { CString strUserID = _T(""); xml.ResetMainPos(); if (xml.FindChildElem("SHIPMENT")) { xml.IntoElem(); if (xml.FindChildElem("POC")) { xml.IntoElem(); CString str_type=xml.GetAttrib("type"); MessageBox(str_type); xml.SetAttrib("type","change"); strUserID = xml.GetData(); if (xml.FindChildElem("TEL")) { xml.IntoElem(); xml.SetData("123456789"); xml.Save("UserInfo.xml"); return; } } } } (七)删除元素: 删除SN=132487A-J的项目。 CMarkup xml; if (xml.Load("UserInfo.xml")) { CString strUserID = _T(""); xml.ResetMainPos(); if (xml.FindChildElem("ITEM")) { xml.IntoElem(); CString str_sn; xml.FindChildElem("SN"); str_sn=xml.GetChildData(); if(str_sn=="132487A-J") { xml.RemoveElem(); xml.Save("UserInfo.xml"); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值