智能终端定制开发 ad
MTK/瑞芯微/高通-Android,智能模块/智能终端方案商

深度定制各类智能终端和智能硬件产品,提供硬件选型咨询、参考设计、元器件推荐、驱动开发、行业模块集成、操作系统定制与算法集成等软硬件定制服务。
contact.aspx

Android核心板产品覆盖2G、3G、4G通讯,双核、四核、八核CPU,可选的平台有MTK6580、MTK6737、MTK6750等,Android版本有5.1 6.0 7.0等。
contact.aspx

可广泛应用于低端智能POS、安防监控、车载设备、低端智能机器人、智能家居、智能硬件、工业智能手持设备、低端智能对讲设备、低端警务或执法设备、智能穿戴、贩卖机、物流柜、智能门禁系统等行业和设备。
contact.aspx

可提供以太网转串口透传,WIFI转串口透传,蓝牙转串口透传,CAN总线模拟量控制输出模块等。
contact.aspx

带3G或4G通讯功能,运行android系统,有多个串口,可以外挂各种模块:条码扫描、RFID、指纹识别、身份证识别、磁条卡、ID卡、GPS/北斗模块等。
contact.aspx

具有4G通讯功能,多个RS232或RS485接口,以太网接口,USB接口,CAN接口,多个AD输入。基于Android系统智能平台,方便APP应用开发。器件严格选型,运行稳定,质量可靠。
contact.aspx

简单实用的Xml解析类
[VC 编程] 2008-04-03



作者:李天助

下载源代码

  今天有点郁闷,不想干活。整理代码的时候,看到了这个好久之前写的代码,于是想整理出来供大家拍砖。XML的解析对于.Net平台那真是太简单不过了,感谢微软。但对于C++语言的XML解析就没那么容易了。有一个开源的XML4C是IBM的,功能强大,但代码大的有几M,而且对于GB2312的支持有问题,据说能解决,但可能是我天生愚钝,当初我花了2周时间也没搞定,最后放弃,自己写了一个。咦?还能跑起来,也能跨平台:)。 写这个XML解析类,以功能最简单,最实用,最常用的功能为原则,因为只能解析,查找,没有XML文档生成器。如果需要生成XMl文档,还是自己拼凑字串吧。
  此解析器的接口完全模仿XML4C的对外接口,使用也很类似,稍有不同,对复杂部分进行了封装。总共分3个类: CPacket、DOMElement、DOMDocument。 DOMElement为节点类,主有有tag、level、 parent、childlist 等几个属性。DOMElement类主要是对XML文档的解析,生成,对整个XML文档 生成DOM树。CPacket主要是对XML文档的封装,提供对外的接口。

下面简单示例一下使用方法:

1、创建DOM树,得到XML对象:

解析分两种,第一种是对xml string 字串的解析,另一种是对文件的解析。对应函数分别为:

CPacket::BuiltTree(const char* pBuf,int nBufSize); CPacket::BuiltTree(MLPCSTR pXmlPath);
使用示例:
CPacket inPacket; DOMElement* TransNode = NULL; DOMElement* AccNode = NULL; inPacket.BuiltTree(strXml.c_str(),strXml.size()); //生成DOM树结构. inPacket.BuiltTree("c:\\1.xml"); //生成DOM树结构.
2、对原有DOM树添加子结点:

可以通过CPacket::CreateElement(char szNodeName[]) 来创建字节点,示例:

(1)CPacket::CreateElement("/Root/Cust/Tel")
会在根节点下创建Root/Cust/Tel 如果存在Root和Cust节点了则不在创建,否则会创建3个节点,Root,Cust,Tel 并且具有父子关系。
(2)CPacket::CreateElement("Root/Cust/Tel")
  会在当前节点下创建Root,Cust,Tel,至于当前节点,可以通过SetCurrentElement 来设置,默认根节点是当前节点. 3、节点的查找,节点的查找,有4个函数可以用:
CPacket::SearchElement(char * szNodeName); //搜索普通节点,分绝对路径(路径以/开头),相对路径 CPacket::SearchElement(char * szNodeName,char * szProper,char * szId); //指定属性 CPacket::SearchNextElement(bool pMoveNext = TRUE); //当前节点的下一个兄弟节点,参数决定向下移动当前节点,这个函数速度最快 CPacket::SearchNextElement(char *szNodeName,char *szProper = NULL,char *szId = NULL); //下一个节点
整体使用示例:
void main() { string strXml = ""; CPacket inPacket; DOMElement* TransNode = NULL; DOMElement* AccNode = NULL; inPacket.BuiltTree(strXml.c_str(),strXml.size());//生成DOM树结构. printf("%s",inPacket.GetXml(NULL).c_str()); //MessageBox(inPacket.GetXml(NULL).c_str()); AccNode = inPacket.SearchElement("/Xml/Body/TelNums/TelNum"); if(!AccNode) return; inPacket.SetCurrentElement(AccNode); while(AccNode) { printf("%s",AccNode->getTextContent()); MessageBox(AccNode->getTextContent()); AccNode = inPacket.SearchNextElement(true); } //注意因为当前节点已经不是根节点,因此如果是全局查找就要在节点名前加上"/" 的全局路径 //AccNode = inPacket.SearchElement("/TelNum","Id","1"); inPacket.ResetCurrentNode(); AccNode = inPacket.SearchElement("TelNum","Id","1"); printf("%s",AccNode->getTextContent()); //MessageBox(AccNode->getTextContent()); //创建XML文档 CPacket outPacket; outPacket.SetRootTag("Root"); AccNode = outPacket.CreateElement("/Root/Cust/Tel"); AccNode->setTextContent("075507895461"); printf("%s",outPacket.GetXml(NULL).c_str()); //MessageBox(outPacket.GetXml(NULL).c_str()); }

  当时写的时候仅仅是为了满足我自己使用的方便,很多复杂功能没有实现,代码测试也远远不够,问题很多,真有点怕误导大家,希望大家看后,能够重新写一份出来,供大家使用,有问题发邮件给我:mycrolee@163.com 原来的邮箱mycro@163.com 被一个LJ给盗了。永远BS这种渣滓。

[VC 编程添加评论 | 评论/阅读(0/282)
评论
昵称
主页
内容
递交


Copyright @ 我的开发笔记     2008 - 2017         粤ICP备19155526号-1