昨天要实现一个从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都要如此更改哦~辛苦一下呗~