spxml 是一个实现了 pull 和 dom 两种解释模型的 xml 解释器。
spxml 使用 c++ 实现,除系统库之外,不依赖第三方库,目前实现了以下功能:
1.实现了 xml pull parser 的功能;
2.基于 xml pull parser 构造一个 dom tree;
3.能够对 dom tree 进行修改;
4.能把 dom tree 重新序列化为一个字符流;
5.处于底层的 xml pull parser 是一个面向流的解释器,用户不需要一次把一个完整的 xml 字符流传递给 spxml ,极端情况下,可以每次只传入一个字符。解释到一个文档结束时,自动生成 EndDocument 事件;
6.xml dom parser 同样继承了面向流的特性;
7.使用 xmlbench 框架做压力测试,性能与 expat 相当接近。
源代码下载:
http://spxml.googlecode.com/files/spxml-0.3.src.tar.gz
一些设计思路的说明:
最近在使用 cpp 做 xmlrpc 相关的内容,顺便看了一下几个 xmlrpc 的实现,连带看了一下 expat 的实现。
发现 expat 的接口非常的精简,不过实现的代码比较长,比较难读。
看完之后,有空的时候就在思考有什么办法可以简化 xml parser 的实现。
想了几天之后,想到一个方法:expat 里面有很多的 switch case 结构,要简化这些 switch ,最好使用 state pattern 。
具体的想法如下:
<<1>> 设计一个 XmlReader 类,作为 state pattern 中的 State 类。
XmlReader 的多个子类作为 state pattern 的 ConcreteState 类,
每个 reader 代表 xml parser 的一个状态。
比如有:XmlDocDeclReader,XmlStartTagReader,XmlEndTagReader,XmlCDataReader,
XmlCommentReader,XmlDocTypeReader等等。
<<2>> xml parser 本身作为 state pattern 中的 Context 类。
这样设计的好处(为描述方便,称这个 xml parser 为 spxml):
<<1>> 每个 XmlReader 识别特定的开始符和结束符,把属于它自己的字符保存下来。
在遇到它的结束符之后,设置 spxml 的后继 XmlReader。
<<2>> 每个 XmlReader 在读取到结束符之后,把保存下来的字符串转换成 parser 相应的事件。
比如:对于 XmlStartTagReader 来说,如果是一个 pull-model 的 xml parser,
将产生一个 START_TAG event;如果是一个 sax-model 的 xml parser,那么将产生
StartElement event。
<<3>> 这样把 xml 的各个部分的处理分散到了不同的类里面,每个类只处理一类情况,
这就使得 spxml 的实现从整体上简化了。
<<4>> spxml 像 expat 一样,是一个面向流的解释器。
使用者可以把任意大小的 xml 片断(从一个字节到完整的 xml document)传递给 spxml 进行解释。
expat 需要由使用者指出 xml document 何时结束;相反,spxml 不需要由调用者指定 xml document
何时结束,在解释完 root element 之后,spxml 将返回 END_DOCUMENT 事件。
因此 spxml 适合使用在类似 jabber 这类协议的通讯中。
因为 jabber 的传输协议中,任意两个请求包中是没有明显的分隔符的,每个请求只是一个完整的 xml element。
为了验证一下自己的想法,趁这段时间休假,花了几天时间实现了一下,初步看起来还是不错的。目前针对简单的 xml 实现了 xml pull parser 和 xml dom parser,足够用来处理 xmlrpc。
分享到:
相关推荐
NULL 博文链接:https://wang-peng1.iteye.com/blog/1145047
xml 文件解析 解析后放在数组中可以进行访问(还有一点小问题)
pull-parser-2.jar,解析XML,JSON 類庫,工具包,用於Android移動開發
dom4j-1.6.1 pull-parser-2.1.10
pull-parser-2.1.10.jar relaxngDatatype-20030807.jar xml-apis-2.0.2.jar xpp3-1.1.3.3.jar xsdlib-20030807.jar 从GitHub上下载下来的,CSDN这资源分设置...恩,算了,没积分的自己去下载吧: ...
linux gh r g wh perl-xml-parser packeg
Perl 6:HTML :: Parser :: XML; 该模块将读取HTML并尝试构建XML :: Document( )特征: 如果遇到某些其他标签,则自动关闭某些标签很好地解析脏HTML(AFAIK),如果不正确,则提交错误Perl6的魔力状态: 错误/功能...
ua-parser-1.3.0.jar,现在maven中http://maven.twttr.com/ua_parser/ua-parser/1.3.0/ua-parser-1.3.0.pom下载不下来。
Oracle DOM编程 文档,有要的没 Start from toc.htm DBMS_XMLDOM DBMS_XMLPARSER DBMS_XMLQUERY
用于Embulk的XML分析器插件 解析器插件。 从输入中读取数据作为xml并提取每个条目以输出。 总览 插件类型:解析器 全部加载或全部不加载:是 支持的简历:否 种类 xml :通过SAX查找行。 xpath :Find通过Xpath...
he Microsoft® XML Parser (MSXML) 3 SDK includes header and .lib files, and documentation for the MSXML 3 Release.
包含simple和parser 很好用的xml解析文件
unity3d 读取 xml 插件 XMLParser。 unity3d 读取 xml 插件 XMLParser Unity 5.3。 unity3d读取xml插件XMLParser,用于读取xml文件 unity3d xml XMLParser
html-dom-parser 在服务器(Node.js)和客户端(浏览器)上均可使用HTML到DOM解析器: HTMLDOMParser(string[, options])解析器将HTML字符串转换为描述DOM树JavaScript对象。例子const parse = require ( '...
Android 官方的pull解析XmlDemo 1. 选择解析器 Choose a Parser 官方推荐XmlPullParser,其在android中对XML的解析是高效且可维护的。android已经拥有该接口的两个实现: KXmlParser,通过XmlPullParserFactory....
我好朋友收集并且整理的XML解析工具,希望大家能用上。 特点:简单、超小、稳定 鼓励一下吧!
提供对Xml文件的解析功能,xml, parser
使用javascript正则表达式的dom解析器。 不需要节点环境或特殊的浏览器!!! 支持react,react-native,vue等... 安装 npm install --save react-native-dom-parser 用法 import DomSelector from 'react-native-...
一个老外用C++写的xml打包和解析的类,很简单,但是功能很强大,并且是跨平台的,我这两年一直在用,强烈建议大家使用!!这是我目前用过的最好用的xmlparser.就包括两个文件xmlparser.h和xmlparser.cpp
ltp模型:3.4 模型链接https://download.csdn.net/download/llm765800916/12509692 https://download.csdn.net/download/llm765800916/12509682 https://download.csdn.net/download/llm765800916/12509681 ...