分享
 
 
 

Chamoro 新版的XML解析器

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Chamoro 使用说明

主要分三部分:

1.XML结构操作部分

一般的节点选择以及建立,查询,删除和属性的管理

2.XML数据解析部分

解析XML原始数据成XML结构

3.XML数据源操行部分

提供多种的数据来源,支持内存中的字符串,文件,pipe,socket等等

说之前,需要简单说明一下,Charmoro并不完全支持xml1.0的规范,只是小部分,另外,

对汉字的支持,这个版本里没有加入unicode的支持,不同于原先的TXML,所以在处理汉字时,

希望你能自己测试一下 ,但对gb2312的支持是很好的 :)

另外,xml 1.0里规定只能有一个根节点,但这个解析器支持多个"根"节点的,也就是说,

没有根节点的说法,只有第一个节点的说法,所以,如果要和其他解析器协同工作时,需要注意

这点尽量不要写多个的"根"节点(在xml1.0里注释是不算在节点的,所以说可以你可以有多个的

注释,但尽量少几个"根"节点)

先说说第一部分:

Chamoro 支持的类型有:

enum NODETYPE

{

DECLARE, /*宣告*/

DISPOSE, /*处理 :) */

NODE, /*节点*/

COMMENT, /*注释*/

HOLD, /*原样*/

UNKNOW /*未知*/

};

(1).DECLARE, /*宣告*/ 也就是<?xml version="1.0"?>这行

(2).DISPOSE, /*处理*/ 这个版本中暂时不支持,一般来说就是以<!或<?开头的,但不

不是宣告(<?xml)或注释<?>

(3).NODE, /*节点*/ 这是XML最常见的节点,包括属性

(4).COMMENT, /*注释*/ 注释节点以"<!--"开头和"-->"结尾的

(5).HOLD /*原样*/ CDATA 值,这个节点和<NODE>的基本功能是一样的,不同的是

节点的值不需要进行转义(关于转义内容,我会在后面补充一下)

主要是两个结构体

struct tagQXml

{

QStringList m_listDeclare; /* 宣告的链表,存储QString :) */

QXmlNode *m_nodeRoot;

int m_nErrorCode;

QXmlVtbl *lpVtbl;

unsigned long m_nRow;

unsigned long m_nCol;

};

tagQXML 是XML的基本结构,一般的调用方法就是

QXml xml = NewQXml();

如果需要指针结构的,那就用

QXml *xml = MallocQXml();

PS: 这个程序的调用方法基本上是这样的,调用方法有点怪怪的 :)

QXML 的主要函数在:

typedef struct QXmlVtbl {

QXmlNode *(*ToRoot) (QXml *self);

int (*ParseFile) (QXml *self,char *fileName);

int (*ParseBuff) (QXml *self,char *buff);

int (*SaveToFile) (QXml *self,char *fileName);

char *(*GetErrText) (QXml *self);

int (*GetDeclareData) (QXml *self,QString *data);

void (*Release) (QXml *self);

}QXmlVtbl;

是指针函数调用就像这样

xml.lpVtbl->ToRoot(&xml);

ToRoot 的作用就是到一个节点,宣告不算是第一个节点的

ParseFile 解析一个文件名

ParseBuff 解析一段字符串

SaveToFile 将解析内容保存成文件

GetErrText 嗯.这个还没有做 :P

GetDeclareData 是生成宣告的字符串

Release 就是释放,整个程序中,除了QXml可以释放以外其他的像QXmlNode 的

请不要手工释放(应该设计相应的删除或消除函数)!由QXml自己管理

:( C语言的安全性就是没有C++好

这是正常的xml调用,也就是解析.保存.

当然了.你可以通过操作Node来维护或创建一个XML文件

QXmlNode 的结构如下

struct tagQXmlNode

{

QString m_szName;

QString m_szValue;

int m_nType;

QList m_listAttrib;

QXmlNode *m_nodeChild;

QXmlNode *m_nodeNext;

QXmlNode *m_nodePrev;

QXmlNode *m_nodeParent;

QXmlNodeVtbl *lpVtbl;

};

这是比较典型的树型结构

调用和操作方法和QXml类似,只是函数不同而已,我就把主要的函数说一下.

typedef struct QXmlNodeVtbl {

QXmlNode *(*ToParent) (QXmlNode *self);

// 返回父节点,如果为空,应该就是"根"节点了

QXmlNode *(*ToChild) (QXmlNode *self,char *name);

//到子节点,如果name为空.到第一个节点,

QXmlNode *(*ToNextNode) (QXmlNode *self,char *name);

//下一节点,如果name为空.就到下一个节点.否则到下一个name的节点

QXmlNode *(*ToPrevNode) (QXmlNode *self,char *name);

//同上,不同的是到上一个节点

QXmlNode *(*ToFirstChild) (QXmlNode *self);

//到第一个子节点

QXmlNode *(*ToLastChild) (QXmlNode *self);

//到最后一个子节点

BOOL (*AddChild) (QXmlNode *self,char *name ,char *value);

//增加子节点

BOOL (*AddNodeToChild) (QXmlNode *self,QXmlNode *node);

//附加一个子节点到最后,

BOOL (*SetNodeName) (QXmlNode *self , char *name);

BOOL (*SetNodeValue) (QXmlNode *self , char *value);

char *(*GetNodeName) (QXmlNode *self);

char *(*GetNodeValue) (QXmlNode *self);

int (*GetNodeType) (QXmlNode *self);

int (*GetNodeData) (QXmlNode *self,QString *data ,int depth);

BOOL (*SetAttrib) (QXmlNode *self , char *name , char * value);

//同名的会被重写value

char *(*GetAttrib) (QXmlNode *self , char *name);

BOOL (*RemoveAttrib) (QXmlNode *self , char *name);

void (*Destory) (QXmlNode *self);

//消除一个节点

void (*Release) (QXmlNode *self);

//正常的情况下不要调用 这个函数

}QXmlNodeVtbl;

具体的例子,可以看看qxml.c里的getnodedata的函数.

转义的.只支持五种,& " ' < > 就这五个,

:( 我要上班了.不然就迟到了

然后有相同爱好的.一起加入.把这个做得更好,完全 支持unicode以及dtd

UP.发呆的上帝

MSN:31-boy@163.com

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有