热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单的XML读取器

XML指可扩展标记语言(EXtensibleMarkupLanguage)(有个很明显的槽点),是一种主要设计用来数据传输存储的语言。有关语法规则我是参考了这个链接。http:www.w3
  • XML 指可扩展标记语言(EXtensible Markup Language)

 (有个很明显的槽点),是一种主要设计用来数据传输存储的语言。

有关语法规则我是参考了这个链接。

http://www.w3school.com.cn/xml/xml_syntax.asp

看 gcc4 的时候觉得数据驱动编程很酷,于是顺带觉得xml很酷,正好暑假闲就写了个xml读取器看看,鼓捣了几天,弄好了大致上的功能,这里所说大致上,是能够满足检查语法错误并给出错误信息到标准输出设备(不保证报错信息绝对有用)。如果满足语法规则,就能正确读取xml所描述的数据并保存成一颗元素树。

以上这些是初期的目标,大体上实现了,接下来再说说另外想要实现的

1.实现一个接口类,提供能使用户方便使用的功能足够强大的接口去访问读取出来的 xml 树。比如查找所有 name 为 "title" 的标签

2.正确处理声明,因为没有处理声明,所以中文什么的就别想了,话说bom我也没处理。。。

3.正确处理注释(其实我觉得像现在这样跳过忽略就挺好的)

4 .正确处理 DOCTYPE,不得不说,这个的语法我觉得比xml的要复杂, xml 这个算良心级的简单易解析的语法我都写出了那又臭又长的代码,完成这个目标的工作量让我敬而远之,感觉不太可能会去写了。

说说写的过程的一些感受, xml 的设计者良心大大地好啊,因为 tag 的对称 close 的要求,可以很方便地用一个堆栈去完成读取建树过程,错误检查难度也下降很多

各种语法上看似苛刻的规定虽然麻烦了它的编写(真的会有人手写这个嘛,怎么想都是程序生成靠谱啊。。),但是却很有利于去读取它,可以经常一言不合就报错,哈哈,写起来轻松不少。另外就是因为是用 c++ 写它的,所以本能地就用了面对对象的写法,后来发现不对,一大半代码是由 buildTree 组成的,有一种以前没学函数写 c 语言的感觉,后来代码就变成了这样大而不当的样子(快200行的成员函数你怕不怕!)

https://github.com/Dadio44/TxmlReader/blob/master/TxmlReader/TxmlReader.cpp

后来想了想,这种算法比较复杂的代码(又设计到很多局部变量),干脆把解析过程放在非成员函数,把大函数切割成许多小函数,可读性,可修改性,可重用性都会好很多,所以说写代码时千万不能偷懒,觉得这里只是需要怎么样怎么样,这样就好了,结果经验表明一次把代码写好是不可能的,以后总要这样那样,随时做好代码会变得面目全非的准备比较好,切莫图一时之快。这个代码需要好好地 reconstructe 。但是,以上的目标都要建立在我闲下来又心情好的情况下,比较仔细想想老坑还是有很多没填的。。。

最后这个是完整代码

https://github.com/Dadio44/TxmlReader/tree/master/TxmlReader

 


7月21日

 

增加了对 utf-8(无BOM)的支持,本来还想试着支持下其他编码的,但是太麻烦还是算了,反正这个编码的使用率对其他的编码是碾压而且又很好兼容 asiic (感觉就是因为这点所以才流行 )所以,别的编码不要想了,在在 windows 上运行的话,需要把 utf-8 转 gbk (中文)才能在控制台看懂输出(其实也可以通过换控制台编码来解决)。所以用了宏来区分操作系统(仅linux和windows有测试过)

 


 

 7月24日

知道了 DOM 这东西就开始着手写对 XML 的编程接口,鼓捣了两天,各种疯狂查询 STL,早知道就把 C++ Primer 带回家,现在这些通过了简单的测试。

XmlTreeHandle 用来当作接口类的,大部分只是对 XmlTree 的接口做了内联调用而已。除了 addChild() 这个函数 ,因为在成员函数中,无法把当前调用 XmlTree

相关的 shared_ptr 传给当前的 XmlTree 的 _parent (类型是 weak_ptr)。为了能够以实现对一个 XmlTree 添加子树,子树能自动修改父节点,就需要这个接口类的

存在,没错,只为了一个函数就给它加了个类,才怪,只是因为这样能更好地封装,鬼知道明天会不会发现什么新bug,或者想加什么新功能。

后续可能会加入声明的读取。这样就能把读出来的 XML 树给修改(或者不)然后输出保存成新的 XML 文档。当然这一切都只是 可能,最后顺便一提,现在带 BOM 的 UTF-8 也支持了。

 


推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • 本文整理了Java中org.gwtbootstrap3.client.ui.Icon.addDomHandler()方法的一些代码示例,展示了Icon.ad ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 第四讲ApacheLAMP服务器基本配置Apache的编译安装从Apache的官方网站下载源码包:http:httpd.apache.orgdownload.cgi今 ... [详细]
author-avatar
rhp3465483
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有