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

来源:互联网 发布:随身带者淘宝去异世 编辑:程序博客网 时间:2024/05/20 22:38

    昨天要实现一个从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 0
原创粉丝点击