您的位置:首页 > 其它

Chamoro 新版的XML解析器

2004-10-28 09:32 211 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: