McbXML.h
上传用户:loctitetv
上传日期:2008-08-08
资源大小:42k
文件大小:11k
源码类别:

中间件编程

开发平台:

Visual C++

  1. /**
  2.  ****************************************************************************
  3.  * <P> McbXML.h - declaration file for basic XML parser written in ANSI C for
  4.  * portability.
  5.  * It works by using recursion and a node tree for breaking down the elements
  6.  * of an XML document.  </P>
  7.  *
  8.  * @version     V1.0
  9.  *
  10.  * @author      Martyn C Brown
  11.  *
  12.  * @changeHistory  
  13.  * 21st August     2001  -  (V1.0) Creation (MCB)
  14.  ****************************************************************************
  15.  */
  16. /*
  17.  ****************************************************************************
  18.  * Include only once
  19.  ****************************************************************************
  20.  */
  21. #ifndef McbXML_Included
  22. #define McbXML_Included
  23. /*
  24.  ****************************************************************************
  25.  * Include all necessary include files
  26.  ****************************************************************************
  27.  */
  28. #include <tchar.h>
  29. /*
  30.  ****************************************************************************
  31.  * Some common types for char set portable code
  32.  ****************************************************************************
  33.  */
  34. #ifndef LPCTSTR
  35. #define LPCTSTR const char *
  36. #endif /* LPCTSTR */
  37. #ifndef LPTSTR
  38. #define LPTSTR char *
  39. #endif /* LPTSTR */
  40. #ifndef TCHAR
  41. #define TCHAR char
  42. #endif /* TCHAR */
  43. #ifndef FALSE
  44. #define FALSE 0
  45. #endif /* FALSE */
  46. #ifndef TRUE
  47. #define TRUE 1
  48. #endif /* TRUE */
  49. /*
  50.  ****************************************************************************
  51.  * List macros.
  52.  ****************************************************************************
  53.  */
  54. #define ListEntry(ptr,type,member)
  55. ((type*)((char*)ptr-(unsigned long)(&((type*)0)->member)))
  56. /*
  57.  ****************************************************************************
  58.  * Enumeration used in union to decipher what type a node is.
  59.  ****************************************************************************
  60.  */
  61. typedef enum McbXMLNodeType
  62. {
  63. eNodeEmpty = 0,
  64. eNodeAttribute,
  65. eNodeElement,
  66. eNodeText,
  67. eNodeClear
  68. } McbXMLNodeType;
  69. #define  McbSTOREOFFSETS
  70. /*
  71.  ****************************************************************************
  72.  * Structure used for a node
  73.  ****************************************************************************
  74.  */
  75. typedef struct McbXMLNode
  76. {
  77.    /*
  78.     *************************************************************************
  79.     * This dictates what the node is (and consequently which pointer should
  80. * be used to obtain the appropriate node).
  81.     *************************************************************************
  82.     */
  83. enum McbXMLNodeType type;
  84.    /*
  85.     *************************************************************************
  86.     * Union to access the appropriate node.
  87.     *************************************************************************
  88.     */
  89. union
  90. {
  91. struct McbXMLAttribute *pAttrib;
  92. struct McbXMLElement *pElement;
  93. struct McbXMLText *pText;
  94. struct McbXMLClear *pClear;
  95. } node;
  96. #ifdef McbSTOREOFFSETS
  97. int nStringOffset;
  98. #endif /* McbSTOREOFFSETS */
  99. } McbXMLNode;
  100. /*
  101.  ****************************************************************************
  102.  * Structure used to manage list of nodes
  103.  ****************************************************************************
  104.  */
  105. typedef struct McbXMLElement
  106. {
  107. LPTSTR lpszName; /* Element name  */
  108. int nSize; /* Num of child nodes  */
  109. int nMax; /* Num of allocated nodes  */
  110. int nIsDeclaration; /* Whether node is an XML  */
  111. /* declaration - '<?xml ?>'  */
  112. struct McbXMLNode *pEntries; /* Array of child nodes  */
  113. struct McbXMLElement *pParent; /* Pointer to parent element */
  114. } McbXMLElement;
  115. /*
  116.  ****************************************************************************
  117.  * Structure for XML text
  118.  ****************************************************************************
  119.  */
  120. typedef struct McbXMLText
  121. {
  122. LPTSTR lpszValue;
  123. } McbXMLText;
  124. /*
  125.  ****************************************************************************
  126.  * Structure for XML clear (unformatted) node
  127.  ****************************************************************************
  128.  */
  129. typedef struct McbXMLClear
  130. {
  131. LPTSTR lpszOpenTag;
  132. LPTSTR lpszValue;
  133. LPTSTR lpszCloseTag;
  134. } McbXMLClear;
  135. /*
  136.  ****************************************************************************
  137.  * Structure for XML attribute.
  138.  ****************************************************************************
  139.  */
  140. typedef struct McbXMLAttribute
  141. {
  142. LPTSTR lpszName;
  143. LPTSTR lpszValue;
  144. } McbXMLAttribute;
  145. /*
  146.  ****************************************************************************
  147.  * Enumeration for XML parse errors.
  148.  ****************************************************************************
  149.  */
  150. typedef enum McbXMLError
  151. {
  152. eXMLErrorNone = 0,
  153. eXMLErrorEmpty,
  154. eXMLErrorFirstNotStartTag,
  155. eXMLErrorMissingTagName,
  156. eXMLErrorMissingEndTagName,
  157. eXMLErrorNoMatchingQuote,
  158. eXMLErrorUnmatchedEndTag,
  159. eXMLErrorUnexpectedToken,
  160. eXMLErrorInvalidTag,
  161. eXMLErrorNoElements
  162. } McbXMLError;
  163. /*
  164.  ****************************************************************************
  165.  * Structure used to obtain error details if the parse fails.
  166.  ****************************************************************************
  167.  */
  168. typedef struct McbXMLResults
  169. {
  170. enum McbXMLError error;
  171. int nLine;
  172. int nColumn;
  173. } McbXMLResults;
  174. /*
  175.  ****************************************************************************
  176.  * Construct/delete root element
  177.  ****************************************************************************
  178.  */
  179. McbXMLElement * McbCreateRoot();
  180. void McbDeleteRoot(McbXMLElement * pElement);
  181. /*
  182.  ****************************************************************************
  183.  * Obtain error information in a string.
  184.  ****************************************************************************
  185.  */
  186. LPCTSTR McbGetError(McbXMLError error);
  187. /*
  188.  ****************************************************************************
  189.  * Parse XML string into elements.  This returns a pointer to the first 
  190.  * element (created on the heap) if successful.  This must be deleted by 
  191.  * first calling McbDeleteElement() to recursively delete child nodes then 
  192.  * calling free on the element to cleanup the heap.
  193.  * If the function fails then 0 will be returned.  If the results pointer
  194.  * given to the function was not 0 the error, line and column can be 
  195.  * obtained.
  196.  ****************************************************************************
  197.  */
  198. McbXMLElement * McbParseXML(LPCTSTR lpszXML, McbXMLResults *pResults);
  199. /*
  200.  ****************************************************************************
  201.  * Clears an element (deletes its children and the memory which belongs to 
  202.  * it).
  203.  ****************************************************************************
  204.  */
  205. void McbDeleteElement(McbXMLElement *pEntry);
  206. /*
  207.  ****************************************************************************
  208.  * Enumerate nodes in the list returning a pointer to a node.  The index 
  209.  * pointer should be initialised to zero initially - this will be incremented 
  210.  * for each subsequent node that is obtained.
  211.  * 0 will be returned when all nodes have been obtained.
  212.  ****************************************************************************
  213.  */
  214. McbXMLNode * McbEnumNodes(McbXMLElement *pEntry, int *pnIndex);
  215. /*
  216.  ****************************************************************************
  217.  * Recursively search the tree for the required element based on the given
  218.  * path.
  219.  ****************************************************************************
  220.  */
  221. McbXMLElement * McbFindElement(McbXMLElement *pHead, LPCTSTR lpszName);
  222. /*
  223.  ****************************************************************************
  224.  * Search the given element for an attribute.
  225.  ****************************************************************************
  226.  */
  227. McbXMLAttribute * McbFindAttribute(McbXMLElement *pEntry, LPCTSTR lpszAttrib);
  228. /*
  229.  ****************************************************************************
  230.  * Enumerate elements on the given element.
  231.  ****************************************************************************
  232.  */
  233. McbXMLElement * McbEnumElements(McbXMLElement *pEntry, int *pnIndex);
  234. /*
  235.  ****************************************************************************
  236.  * Add an attribute to the element
  237.  ****************************************************************************
  238.  */
  239. McbXMLAttribute * McbAddAttribute(McbXMLElement *pEntry, LPTSTR lpszName, 
  240. LPTSTR lpszValue, int nGrowBy);
  241. McbXMLText * McbAddText(McbXMLElement *pEntry, LPTSTR lpszValue, int nGrowBy);
  242. /*
  243.  ****************************************************************************
  244.  * Enumerate attributes on the given element.
  245.  ****************************************************************************
  246.  */
  247. McbXMLAttribute * McbEnumAttributes(McbXMLElement *pEntry, int *pnIndex);
  248. /*
  249.  ****************************************************************************
  250.  * Create elements in the list based on the path, returning the final node.
  251.  ****************************************************************************
  252.  */
  253. McbXMLElement * McbCreateElements(McbXMLElement *pEntry, LPCTSTR lpszPath);
  254. /*
  255.  ****************************************************************************
  256.  * Duplicate a string.
  257.  ****************************************************************************
  258.  */
  259. LPTSTR McbStrdup(LPCTSTR lpszData, int cbData);
  260. /*
  261.  ****************************************************************************
  262.  * Create an XML string from the head element.
  263.  * If successful this returns the XML string representation of the specified 
  264.  * XML element node and its subnodes.  This string must be deleted with 
  265.  * free().
  266.  *
  267.  * If the size pointer is not 0 then the total size of the returned string
  268.  * NOT INCLUDING THE NULL TERMINATOR will be updated.
  269.  ****************************************************************************
  270.  */
  271. LPTSTR McbCreateXMLString(McbXMLElement * pHead, int nFormat, int *pnSize);
  272. int McbCreateXMLStringR(McbXMLElement * pEntry, LPTSTR lpszMarker, 
  273. int nFormat);
  274. /*
  275.  ****************************************************************************
  276.  * Add clear unformatted data to the node.
  277.  ****************************************************************************
  278.  */
  279. McbXMLClear * McbAddCData(McbXMLElement *pEntry, LPTSTR lpszValue, int nGrowBy);
  280. /*
  281.  ****************************************************************************
  282.  * Toby add new functions.
  283.  ****************************************************************************
  284.  */
  285. McbXMLElement* AddElementToXML(McbXMLElement *pParent,LPTSTR lpszText);
  286. McbXMLAttribute* AddAttrToXML(McbXMLElement *pEntry,LPTSTR lpszName,LPTSTR lpszValue);
  287. void DeleteElementFromXML(McbXMLElement *pEntry);
  288. void DeleteAttrFromXML(McbXMLAttribute *pEntry);
  289. //void clearList()
  290. #endif /* McbXML_Included */