00001
00085 #ifndef __INCLUDE_XML_NODE__
00086 #define __INCLUDE_XML_NODE__
00087
00088 #include <stdlib.h>
00089
00090 #ifdef _UNICODE
00091
00092
00093
00094
00095
00096 #define _XMLWIDECHAR
00097 #endif
00098
00099 #if defined(WIN32) || defined(UNDER_CE) || defined(_WIN32) || defined(WIN64) || defined(__BORLANDC__)
00100
00101 #define _XMLWINDOWS
00102 #endif
00103
00104 #ifdef XMLDLLENTRY
00105 #undef XMLDLLENTRY
00106 #endif
00107 #ifdef _USE_XMLPARSER_DLL
00108 #ifdef _DLL_EXPORTS_
00109 #define XMLDLLENTRY __declspec(dllexport)
00110 #else
00111 #define XMLDLLENTRY __declspec(dllimport)
00112 #endif
00113 #else
00114 #define XMLDLLENTRY
00115 #endif
00116
00117
00118
00119
00120 #ifdef XML_NO_WIDE_CHAR
00121 #undef _XMLWINDOWS
00122 #undef _XMLWIDECHAR
00123 #endif
00124
00125 #ifdef _XMLWINDOWS
00126 #include <tchar.h>
00127 #else
00128 #define XMLDLLENTRY
00129 #ifndef XML_NO_WIDE_CHAR
00130 #include <wchar.h>
00131
00132 #endif
00133 #endif
00134
00135
00136 #ifdef _XMLWIDECHAR
00137 #define _CXML(c) L ## c
00138 #define XMLCSTR const wchar_t *
00139 #define XMLSTR wchar_t *
00140 #define XMLCHAR wchar_t
00141 #else
00142 #define _CXML(c) c
00143 #define XMLCSTR const char *
00144 #define XMLSTR char *
00145 #define XMLCHAR char
00146 #endif
00147 #ifndef FALSE
00148 #define FALSE 0
00149 #endif
00150 #ifndef TRUE
00151 #define TRUE 1
00152 #endif
00153
00154
00156 typedef enum XMLError
00157 {
00158 eXMLErrorNone = 0,
00159 eXMLErrorMissingEndTag,
00160 eXMLErrorNoXMLTagFound,
00161 eXMLErrorEmpty,
00162 eXMLErrorMissingTagName,
00163 eXMLErrorMissingEndTagName,
00164 eXMLErrorUnmatchedEndTag,
00165 eXMLErrorUnmatchedEndClearTag,
00166 eXMLErrorUnexpectedToken,
00167 eXMLErrorNoElements,
00168 eXMLErrorFileNotFound,
00169 eXMLErrorFirstTagNotFound,
00170 eXMLErrorUnknownCharacterEntity,
00171 eXMLErrorCharacterCodeAbove255,
00172 eXMLErrorCharConversionError,
00173 eXMLErrorCannotOpenWriteFile,
00174 eXMLErrorCannotWriteFile,
00175
00176 eXMLErrorBase64DataSizeIsNotMultipleOf4,
00177 eXMLErrorBase64DecodeIllegalCharacter,
00178 eXMLErrorBase64DecodeTruncatedData,
00179 eXMLErrorBase64DecodeBufferTooSmall
00180 } XMLError;
00181
00182
00184 typedef enum XMLElementType
00185 {
00186 eNodeChild=0,
00187 eNodeAttribute=1,
00188 eNodeText=2,
00189 eNodeClear=3,
00190 eNodeNULL=4
00191 } XMLElementType;
00192
00194 typedef struct XMLResults
00195 {
00196 enum XMLError error;
00197 int nLine,nColumn;
00198 } XMLResults;
00199
00201 typedef struct XMLClear {
00202 XMLCSTR lpszValue; XMLCSTR lpszOpenTag; XMLCSTR lpszCloseTag;
00203 } XMLClear;
00204
00206 typedef struct XMLAttribute {
00207 XMLCSTR lpszName; XMLCSTR lpszValue;
00208 } XMLAttribute;
00209
00211 typedef int XMLElementPosition;
00212
00213 struct XMLNodeContents;
00214
00217
00218
00227 typedef struct XMLDLLENTRY XMLNode
00228 {
00229 private:
00230
00231 struct XMLNodeDataTag;
00232
00234 XMLNode(struct XMLNodeDataTag *pParent, XMLSTR lpszName, char isDeclaration);
00236 XMLNode(struct XMLNodeDataTag *p);
00237
00238 public:
00239 static XMLCSTR getVersion();
00240
00245
00246 static XMLNode parseString (XMLCSTR lpXMLString, XMLCSTR tag=NULL, XMLResults *pResults=NULL);
00258
00259 static XMLNode parseFile (XMLCSTR filename, XMLCSTR tag=NULL, XMLResults *pResults=NULL);
00271
00272 static XMLNode openFileHelper(XMLCSTR filename, XMLCSTR tag=NULL);
00290 static XMLCSTR getError(XMLError error);
00291
00293 XMLSTR createXMLString(int nFormat=1, int *pnSize=NULL) const;
00299
00300 XMLError writeToFile(XMLCSTR filename,
00301 const char *encoding=NULL,
00302 char nFormat=1) const;
00313 XMLCSTR getName() const;
00314 XMLCSTR getText(int i=0) const;
00315 int nText() const;
00316 XMLNode getParentNode() const;
00317 XMLNode getChildNode(int i=0) const;
00318 XMLNode getChildNode(XMLCSTR name, int i) const;
00319 XMLNode getChildNode(XMLCSTR name, int *i=NULL) const;
00320 XMLNode getChildNodeWithAttribute(XMLCSTR tagName,
00321 XMLCSTR attributeName,
00322 XMLCSTR attributeValue=NULL,
00323 int *i=NULL) const;
00324 XMLNode getChildNodeByPath(XMLCSTR path, char createNodeIfMissing=0, XMLCHAR sep='/');
00326 XMLNode getChildNodeByPathNonConst(XMLSTR path, char createNodeIfMissing=0, XMLCHAR sep='/');
00328
00329 int nChildNode(XMLCSTR name) const;
00330 int nChildNode() const;
00331 XMLAttribute getAttribute(int i=0) const;
00332 XMLCSTR getAttributeName(int i=0) const;
00333 XMLCSTR getAttributeValue(int i=0) const;
00334 char isAttributeSet(XMLCSTR name) const;
00335 XMLCSTR getAttribute(XMLCSTR name, int i) const;
00336 XMLCSTR getAttribute(XMLCSTR name, int *i=NULL) const;
00337 int nAttribute() const;
00338 XMLClear getClear(int i=0) const;
00339 int nClear() const;
00340 XMLNodeContents enumContents(XMLElementPosition i) const;
00341 int nElement() const;
00342 char isEmpty() const;
00343 char isDeclaration() const;
00344 XMLNode deepCopy() const;
00345 static XMLNode emptyNode();
00346
00348 ~XMLNode();
00349 XMLNode(const XMLNode &A);
00350 XMLNode& operator=( const XMLNode& A );
00351
00352 XMLNode(): d(NULL){};
00353 static XMLNode emptyXMLNode;
00354 static XMLClear emptyXMLClear;
00355 static XMLAttribute emptyXMLAttribute;
00356
00370 static XMLNode createXMLTopNode(XMLCSTR lpszName, char isDeclaration=FALSE);
00371 XMLNode addChild(XMLCSTR lpszName, char isDeclaration=FALSE, XMLElementPosition pos=-1);
00372 XMLNode addChild(XMLNode nodeToAdd, XMLElementPosition pos=-1);
00373 XMLAttribute *addAttribute(XMLCSTR lpszName, XMLCSTR lpszValuev);
00374 XMLCSTR addText(XMLCSTR lpszValue, XMLElementPosition pos=-1);
00375 XMLClear *addClear(XMLCSTR lpszValue, XMLCSTR lpszOpen=NULL, XMLCSTR lpszClose=NULL, XMLElementPosition pos=-1);
00387 XMLCSTR updateName(XMLCSTR lpszName);
00388 XMLAttribute *updateAttribute(XMLAttribute *newAttribute, XMLAttribute *oldAttribute);
00389 XMLAttribute *updateAttribute(XMLCSTR lpszNewValue, XMLCSTR lpszNewName=NULL,int i=0);
00390 XMLAttribute *updateAttribute(XMLCSTR lpszNewValue, XMLCSTR lpszNewName,XMLCSTR lpszOldName);
00391 XMLCSTR updateText(XMLCSTR lpszNewValue, int i=0);
00392 XMLCSTR updateText(XMLCSTR lpszNewValue, XMLCSTR lpszOldValue);
00393 XMLClear *updateClear(XMLCSTR lpszNewContent, int i=0);
00394 XMLClear *updateClear(XMLClear *newP,XMLClear *oldP);
00395 XMLClear *updateClear(XMLCSTR lpszNewValue, XMLCSTR lpszOldValue);
00396
00403
00404 void deleteNodeContent();
00406 void deleteAttribute(int i=0);
00407 void deleteAttribute(XMLCSTR lpszName);
00408 void deleteAttribute(XMLAttribute *anAttribute);
00409 void deleteText(int i=0);
00410 void deleteText(XMLCSTR lpszValue);
00411 void deleteClear(int i=0);
00412 void deleteClear(XMLCSTR lpszValue);
00413 void deleteClear(XMLClear *p);
00414
00445 static XMLNode createXMLTopNode_WOSD(XMLSTR lpszName, char isDeclaration=FALSE);
00446 XMLNode addChild_WOSD(XMLSTR lpszName, char isDeclaration=FALSE, XMLElementPosition pos=-1);
00447 XMLAttribute *addAttribute_WOSD(XMLSTR lpszName, XMLSTR lpszValue);
00448 XMLCSTR addText_WOSD(XMLSTR lpszValue, XMLElementPosition pos=-1);
00449 XMLClear *addClear_WOSD(XMLSTR lpszValue, XMLCSTR lpszOpen=NULL, XMLCSTR lpszClose=NULL, XMLElementPosition pos=-1);
00450
00451 XMLCSTR updateName_WOSD(XMLSTR lpszName);
00452 XMLAttribute *updateAttribute_WOSD(XMLAttribute *newAttribute, XMLAttribute *oldAttribute);
00453 XMLAttribute *updateAttribute_WOSD(XMLSTR lpszNewValue, XMLSTR lpszNewName=NULL,int i=0);
00454 XMLAttribute *updateAttribute_WOSD(XMLSTR lpszNewValue, XMLSTR lpszNewName,XMLCSTR lpszOldName);
00455 XMLCSTR updateText_WOSD(XMLSTR lpszNewValue, int i=0);
00456 XMLCSTR updateText_WOSD(XMLSTR lpszNewValue, XMLCSTR lpszOldValue);
00457 XMLClear *updateClear_WOSD(XMLSTR lpszNewContent, int i=0);
00458 XMLClear *updateClear_WOSD(XMLClear *newP,XMLClear *oldP);
00459 XMLClear *updateClear_WOSD(XMLSTR lpszNewValue, XMLCSTR lpszOldValue);
00460
00468 XMLElementPosition positionOfText(int i=0) const;
00469 XMLElementPosition positionOfText(XMLCSTR lpszValue) const;
00470 XMLElementPosition positionOfClear(int i=0) const;
00471 XMLElementPosition positionOfClear(XMLCSTR lpszValue) const;
00472 XMLElementPosition positionOfClear(XMLClear *a) const;
00473 XMLElementPosition positionOfChildNode(int i=0) const;
00474 XMLElementPosition positionOfChildNode(XMLNode x) const;
00475 XMLElementPosition positionOfChildNode(XMLCSTR name, int i=0) const;
00476
00478
00479 typedef enum XMLCharEncoding
00480 {
00481 char_encoding_error=0,
00482 char_encoding_UTF8=1,
00483 char_encoding_legacy=2,
00484 char_encoding_ShiftJIS=3,
00485 char_encoding_GB2312=4,
00486 char_encoding_Big5=5,
00487 char_encoding_GBK=6
00488 } XMLCharEncoding;
00489
00493
00494 static char setGlobalOptions(XMLCharEncoding characterEncoding=XMLNode::char_encoding_UTF8, char guessWideCharChars=1,
00495 char dropWhiteSpace=1, char removeCommentsInMiddleOfText=1);
00546
00547 static XMLCharEncoding guessCharEncoding(void *buffer, int bufLen, char useXMLEncodingAttribute=1);
00560 private:
00561
00562
00563 typedef struct XMLNodeDataTag
00564 {
00565 XMLCSTR lpszName;
00566 int nChild,
00567 nText,
00568 nClear,
00569 nAttribute;
00570 char isDeclaration;
00571 struct XMLNodeDataTag *pParent;
00572 XMLNode *pChild;
00573 XMLCSTR *pText;
00574 XMLClear *pClear;
00575 XMLAttribute *pAttribute;
00576 int *pOrder;
00577 int ref_count;
00578 } XMLNodeData;
00579 XMLNodeData *d;
00580
00581 char parseClearTag(void *px, void *pa);
00582 char maybeAddTxT(void *pa, XMLCSTR tokenPStr);
00583 int ParseXMLElement(void *pXML);
00584 void *addToOrder(int memInc, int *_pos, int nc, void *p, int size, XMLElementType xtype);
00585 int indexText(XMLCSTR lpszValue) const;
00586 int indexClear(XMLCSTR lpszValue) const;
00587 XMLNode addChild_priv(int,XMLSTR,char,int);
00588 XMLAttribute *addAttribute_priv(int,XMLSTR,XMLSTR);
00589 XMLCSTR addText_priv(int,XMLSTR,int);
00590 XMLClear *addClear_priv(int,XMLSTR,XMLCSTR,XMLCSTR,int);
00591 void emptyTheNode(char force);
00592 static inline XMLElementPosition findPosition(XMLNodeData *d, int index, XMLElementType xtype);
00593 static int CreateXMLStringR(XMLNodeData *pEntry, XMLSTR lpszMarker, int nFormat);
00594 static int removeOrderElement(XMLNodeData *d, XMLElementType t, int index);
00595 static void exactMemory(XMLNodeData *d);
00596 static int detachFromParent(XMLNodeData *d);
00597 } XMLNode;
00598
00600 typedef struct XMLNodeContents
00601 {
00603 enum XMLElementType etype;
00605 XMLNode child;
00606 XMLAttribute attrib;
00607 XMLCSTR text;
00608 XMLClear clear;
00609
00610 } XMLNodeContents;
00611
00615
00616 XMLDLLENTRY XMLSTR stringDup(XMLCSTR source, int cbData=-1);
00622
00623 XMLDLLENTRY void freeXMLString(XMLSTR t);
00635 XMLDLLENTRY char xmltob(XMLCSTR xmlString,char defautValue=0);
00636 XMLDLLENTRY int xmltoi(XMLCSTR xmlString,int defautValue=0);
00637 XMLDLLENTRY long xmltol(XMLCSTR xmlString,long defautValue=0);
00638 XMLDLLENTRY double xmltof(XMLCSTR xmlString,double defautValue=.0);
00639 XMLDLLENTRY XMLCSTR xmltoa(XMLCSTR xmlString,XMLCSTR defautValue=_CXML(""));
00640 XMLDLLENTRY XMLCHAR xmltoc(XMLCSTR xmlString,XMLCHAR defautValue=_CXML('\0'));
00646
00647
00656 typedef struct XMLDLLENTRY ToXMLStringTool
00657 {
00658 public:
00659 ToXMLStringTool(): buf(NULL),buflen(0){}
00660 ~ToXMLStringTool();
00661 void freeBuffer();
00662
00663 XMLSTR toXML(XMLCSTR source);
00664
00668 static XMLSTR toXMLUnSafe(XMLSTR dest,XMLCSTR source);
00669 static int lengthXMLString(XMLCSTR source);
00670
00671 private:
00672 XMLSTR buf;
00673 int buflen;
00674 } ToXMLStringTool;
00680
00681
00689 typedef struct XMLDLLENTRY XMLParserBase64Tool
00690 {
00691 public:
00692 XMLParserBase64Tool(): buf(NULL),buflen(0){}
00693 ~XMLParserBase64Tool();
00694 void freeBuffer();
00695
00698 static int encodeLength(int inBufLen, char formatted=0);
00699
00705 XMLSTR encode(unsigned char *inByteBuf, unsigned int inByteLen, char formatted=0);
00706
00708 static unsigned int decodeSize(XMLCSTR inString, XMLError *xe=NULL);
00709
00715 unsigned char* decode(XMLCSTR inString, int *outByteLen=NULL, XMLError *xe=NULL);
00716
00721 static unsigned char decode(XMLCSTR inString, unsigned char *outByteBuf, int inMaxByteOutBuflen, XMLError *xe=NULL);
00722
00723 private:
00724 void *buf;
00725 int buflen;
00726 void alloc(int newsize);
00727 }XMLParserBase64Tool;
00730 #undef XMLDLLENTRY
00731
00732 #endif