Chamoro 新版的XML解析器

类别:编程语言 点击:0 评论:0 推荐:

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]


 

本文地址:http://com.8s8s.com/it/it26151.htm