当前位置: 首页 > news >正文

建筑工程网站建设小程序源码怎么搭建

建筑工程网站建设,小程序源码怎么搭建,怎么注册微信号,随意设计一个网站❝自信、冷静、专注。—— TM 熊的自我勉励❞1. 前言熊二从去年开始#xff0c;因项目需求接触到xml报文的处理#xff0c;也是我第一次学习用C/C的方式处理基于DOM模型的xml报文。因为本人比较懒hhh#xff0c;所以第一反应就是去看看网上有没有什么大家都在用的比较好的xm… ❝自信、冷静、专注。—— TM 熊的自我勉励❞1. 前言熊二从去年开始因项目需求接触到xml报文的处理也是我第一次学习用C/C的方式处理基于DOM模型的xml报文。因为本人比较懒hhh所以第一反应就是去看看网上有没有什么大家都在用的比较好的xml处理开源库站在前辈的肩膀上才能看的更远嘛。2. 我找到了哪些库库名称实现语言源码地址基于模型Tinyxml2Chttps://github.com/leethomason/tinyxml2DOMlibxml2Chttp://xmlsoft.org/sources/win32/libxml2-2.7.8.win32.zipDOMCMarkupChttp://www.firstobject.com/Markup115.zipDOMMini-XMLChttp://www.msweet.org/files/project3/mxml-2.9.tar.gzDOM/SAXExpat-XMLChttps://github.com/libexpat/libexpat/SAXXercesC/Java/Perlhttp://xerces.apache.org/mirrors.cgiDOM/SAXSAX(Simple API for XML)是基于事件的其基本工作流程是分析XML文档当发现了一个新的元素时产生一个对应事件并调用相应的用户处理函数。这种方式占用内存少速度快但用户程序相应地会比较复杂。DOM(Document Object Model)是在分析时一次性地将整个XML文档进行分析并在内存中形成对应的树结构同时向用户提供一系列的接口来访问和编辑该树结构。这种方式占用内存大速度往往慢于SAX但可以给用户提供一个面向对象的访问接口对用户更为友好。❝最后我选择了tinyxml2这个库作为项目使用但关于这个库网上的资料看了很多总觉得不算太理想。于是我尝试仅从使用者地角度去看看这个库有没有可能再封装一次使其处理xml报文变得更简单❞3. 我用到了tinyxml库的哪些功能3.1. 根据 DOM模型XML 文档中的每个成分都是一个节点。整个文档是一个文档节点每一个xml元素是一个元素节点而包含在xml元素中的文本是一个文本节点每一个xml属性是一个属性节点总之基于DOM模型xml文档皆为节点。tinyxml2正好利用了这一特性以节点的概念来设计处理函数。3.2.  xml报文的处理在广义上来说无非“增”、“删”、“改”、“查”四部分我在处理xml报文时用的最多的就是“增”、“查”即协议交互中报文的组装和解析。通过将近半年的使用体验不得不说真的很感谢tinyxml2的作者Lee Thomason先生能创作出这个好用的库并开源。接下来我会展示tinyxml组装和解析的步骤并尝试优化我觉得不合理的地方。4. xml报文的组装比如我们要组装这样一段xml报文?xml version1.0 encodingUTF-8?south-bear0.0.0.08888bear-2这是用tinyxml2的基本接口组装报文的方法XMLDocument xmlDoc;XMLNode* parent NULL;XMLElement *child[16] { NULL };parent-InsertEndChild( xmlDoc.NewDeclaration(xml version\1.0\ encoding\UTF-8\));child[1]xmlDoc.NewElement(param); //创建一个名为param的节点child[1]-SetAttribute(name,south-bear); //设置该节点属性parent-InsertEndChild(child[1]); //将该节点加入到parent节点下child[2]xmlDoc.NewElement(ipAddress); //创建一个名为ipAddress的节点child[2]-SetText(0.0.0.0); //设置该节点内容child[1]-InsertEndChild(child[2]); //将该节点加入到param节点下child[2]xmlDoc.NewElement(portNo); //创建一个名为portNo的节点child[2]-SetText(8888); //设置该节点内容child[1]-InsertEndChild(child[2]); //将该节点加入到param节点下child[2]xmlDoc.NewElement(channel); //创建一个名为channel的节点child[1]-InsertEndChild(child[2]); //将该节点加入到param节点下child[3]xmlDoc.NewElement(Name); //创建一个名为Name的节点child[3]-SetText(bear-2); //设置该节点内容child[2]-InsertEndChild(child[3]); //将该节点加入到channel节点下怎么样第一眼看上去是不是有点懵感觉很不好记如果是就对了我当时第一反应也是这样。tinyxml2库在插入元素节点时都会用到NewElement和InsertEndChild等接口但是每插入一个节点后想在该节点下插入下一级节点就很容易将节点搞混淆就是说你在使用tinyxml2库这个接口时必须将每一个插入的节点记下否者可能导致组装的xml报文就是混乱的另外从篇幅上来看重复的代码还是占太多了。于是我开始设想有没有这样一种库我只需要传入每一级节点的相关参数就能自动组装xml报文下面是我设想的组装xml的代码。XMLDocument xmlDoc;XMLNode* parent NULL;XMLElement *child[16] { NULL };child[1]xmlAddNode(xmlDoc, parent, param);//创建一个名为param的节点将该节点加入到parent节点下xmlSetNodeAttr(child[1], name, south-bear);//设置该节点属性xmlAddNode(xmlDoc,child[1], ipAddress, 0.0.0.0);//在param节点下添加ipAddress节点xmlAddNode(xmlDoc,child[1], portNo, 8888);//在param节点下添加portNo节点child[2]xmlAddNode(xmlDoc, child[1], channel);//在param节点下添加channel节点xmlAddNode(xmlDoc, child[2], Name, bear-2);//在channel节点下添加Name节点xmlAddNode和xmlSetNodeAttr接口是我在tinyxml2库的基础上封装的库。❝对于xmlAddNode接口你需要传入❞xml文档对象想要创建的节点的父节点节点名称该节点的文本内容(可选)❝对于xmlSetNodeAttr接口你需要传入❞需要设置属性的节点属性名称属性内容 是不是容易理解多了而且光看child数组元素的下标就能知道当前处在哪一级。操作起来也更方便5. xml报文的解析这是用tinyxml2的基本接口解析上述报文的方法XMLDocument xmlDoc;XMLElement *pXmlRoot NULL;XMLElement *pXmlTra NULL;char name[32] {0};char ipAddress[32] {0};int port 0;if(0 xmlDoc.Parse((const char *)xmlBuf)){ pXmlRoot xmlDoc.RootElement(); pXmlTra pXmlRoot-FirstChildElement(ipAddress);if (pXmlTra ! NULL) {strncpy(ipAddress, (pXmlTra-GetText()), (sizeof(ipAddress)-1)); } pXmlTra pXmlRoot-FirstChildElement(portNo);if (pXmlTra ! NULL) {sscanf(pXmlTra-GetText(), %d, port); } pXmlTra pXmlRoot-FirstChildElement(channel); pXmlTra pXmlTra-FirstChildElement(Name);if (pXmlTra ! NULL) {strncpy(name, (pXmlTra-GetText()), (sizeof(name)-1)); } }emmmm....看上去还是很繁琐能不能变得简洁点下面是我设想的解析xml报文的代码XMLDocument xmlDoc;XMLElement *pXmlRoot NULL;XMLElement *pXmlTra NULL;char name[32] {0};char ipAddress[32] {0};int port 0;if(0 xmlDoc.Parse((const char *)xmlBuf)){ pXmlRoot xmlDoc.RootElement(); xmlGetNodeAttr(pXmlRoot, name, name, sizeof(name)); xmlGetChildNode(pXmlRoot, ipAddress, ipAddress, sizeof(ipAddress)); xmlGetChildNode(pXmlRoot, portNo, port); xmlGetChildNode(pXmlRoot-FirstChildElement(channel),Name, channelName, sizeof(channelName));}xmlGetNodeAttr和xmlGetChildNode接口是我在tinyxml2库的基础上封装的库。❝对于xmlGetNodeAttr接口你需要传入❞节点指针属性名称存放属性内容的缓冲区❝对于xmlGetChildNode接口你需要传入❞父节点想要获取的节点名称存放该节点内容的缓冲区6.easyxml库根据上面的设想我基于tinyxml2库开发了easyxml库这是源码目录树├── demo│   ├── create.cpp│   ├── parser.cpp│   └── test.xml├── src│   ├── easyxml.cpp│   ├── easyxml.hpp│   └── xml_cofig.h└── third ├── tinyxml2.cpp └── tinyxml2.h目录树包含了依赖的tinyxml2源码和使用demo, 在src目录下的即为easyxml库的源码easyxml库的接口有两个实现版本用C函数和宏来实现两种版本各有优缺点在使用中我们按照需求场景来选择。「C函数接口」优点利用c函数的可重载性解析各种类型的字段时接口名称可以不变。缺点因为是函数接口存在实参转形参的过程。比如当获取字符串类型的字段时为防止溢出我们需要传入缓冲区的长度这样一来函数的入参就要增加一个观感上就会不整洁。「宏接口」优点因不存在存在实参转形参的过程完美解决了C函数接口的缺点观感整洁。缺点因宏不具备可重载性所以解析各种类型的字段时就要设计该种类型对应的宏接口❝如上面目录所示easyxml.hpp存放的是C函数接口xml_cofig.h存放的是宏接口 总结如果是对于少量代码的工程上面两种版本的选择没有太大的差别但对于大量代码的工程推荐选择宏接口。❞「easyxml库的开源地址」https://github.com/southbear-club/easyxml❝其中包含的接口当然不止上面示例代码中的这些库啦当然一些更原子的操作还是要用tinyxnl2的基本接口的不过easyxml库已经能帮你解决大部分的xml报文处理的需求了这个库后续我会持续维护更新以使得其能应用于更多的场景。欢迎star哟~❞7. 关于tinyxml2「传送门」如果在这之前你还不太了解xml报文的基础知识可以访问下面的链接恶补恶补。❝https://www.runoob.com/dom/dom-intro.html❞tinyxml2库的接口使用说明❝http://leethomason.github.io/tinyxml2/annotated.html❞「我遇到了哪些坑」XMLDocument类中的Parse函数可以选择传入len参数即要解析的字节数。如果未指定TinyXML-2将假定xml指向以NULL终止的字符串。XMLPrinter类中的CStrSize()函数用以获取xml报文的总长度但返回值长度包含终止符null所以用CStrSize()函数获取xml的长度比实际值多1。如果你希望生成的xml报文是不带格式对齐的那只需要在定义XMLPrinter类的对象时指定compact值为true即可例如❝XMLPrinter printer(0,true,0);❞暂时就想到了这些坑真是一把心酸泪希望你们不要再去踩这些坑了。8.唠唠叨叨最近杭州突然变得好冷啊大家记得添衣服别感冒呀感冒了干啥都不开心。好啦以上就是本期的全部内容学习不是为了变得全知全能而是为了不再害怕未知我是熊二我们下期再见。推荐阅读从cmockery入门C语言单元测试你的github开源项目还没做持续集成么赶紧看看这个还在为查内存泄漏问题痛苦不堪试试这个神器
http://www.lebaoying.cn/news/113854.html

相关文章:

  • 有哪些做短租的网站好wordpress常用插件汇总
  • 如何评价网站是否做的好wordpress 投票
  • 做网站可以用python么网站开发课程百度云
  • 四站合一网站制作诚信网站备案
  • 公司建网站要多少钱石家庄手机端seo
  • 学校网站建设先进个人荣誉网站设计如何做
  • 安徽省建设部网站官网网站建设方案书生鲜
  • 个体做敦煌网站怎么样网页设计素材文字
  • 头条网站模版pc网站直接转换成移动端的网站
  • 建设商务网站作用西安专业网站建设报价
  • 辽宁城市建设网站聊城做wap网站公司
  • 基层建设论文查询官方网站泉州网站建设网站
  • 高校学风建设网站网络营销工具的分类
  • 园林效果图网站网站备案是备什么
  • 分享经济网站怎么建设网站有什么优势
  • 郴州建设工程集团招聘信息网站做会员系统的网站用什么cms好
  • 快速做网站流量数据统计分析打开现场直播
  • 河南网站推广怎么做怎么在网站上打广告
  • 网站建设经验王者荣耀恺和永州建设网站制作
  • 扬中市住房和城乡建设局网站wordpress 支持 标签
  • 咸阳营销型网站建设猎聘网网站谁做的
  • 重庆哪里可以做网站的wordpress 免登陆接口
  • crm网站白银市住房和城乡建设厅网站首页
  • 怀柔网站建设推广网站标题在哪里修改
  • 网上购物网站开发的目的青岛企业建设网站企业
  • 移动网站开发面试学做婴儿衣服网站好
  • 调查问卷网站建设方案泰安软件开发公司哪家好
  • 深圳seo优化多少钱邵阳seo优化
  • 天津网站优化公司手表网站查询
  • 北京网站制作哪些网站自己做宣传