今天有点郁闷,不想干活。整理代码的时候,看到了这个好久之前写的代码,于是想整理 出来供大家拍砖。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); //下一个节点