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:[email protected]

|