38 #ifndef __INCLUDE_XML_NODE__
39 #define __INCLUDE_XML_NODE__
52 #if defined(WIN32) || defined(UNDER_CE)
57 #define _USE_XMLPARSER_DLL
62 #ifdef _USE_XMLPARSER_DLL
63 #ifdef CORELIBRARY_EXPORTS
64 #define XMLDLLENTRY __declspec(dllexport)
66 #define XMLDLLENTRY __declspec(dllimport)
75 #ifdef XML_NO_WIDE_CHAR
85 #ifndef XML_NO_WIDE_CHAR
96 #define XMLCSTR const wchar_t *
97 #define XMLSTR wchar_t *
98 #define XMLCHAR wchar_t
103 #define XMLCSTR const char *
104 #define XMLSTR char *
116 typedef enum XMLError
119 eXMLErrorMissingEndTag,
120 eXMLErrorNoXMLTagFound,
122 eXMLErrorMissingTagName,
123 eXMLErrorMissingEndTagName,
124 eXMLErrorUnmatchedEndTag,
125 eXMLErrorUnmatchedEndClearTag,
126 eXMLErrorUnexpectedToken,
128 eXMLErrorFileNotFound,
129 eXMLErrorFirstTagNotFound,
130 eXMLErrorUnknownCharacterEntity,
131 eXMLErrorCharConversionError,
132 eXMLErrorCannotOpenWriteFile,
133 eXMLErrorCannotWriteFile,
135 eXMLErrorBase64DataSizeIsNotMultipleOf4,
136 eXMLErrorBase64DecodeIllegalCharacter,
137 eXMLErrorBase64DecodeTruncatedData,
138 eXMLErrorBase64DecodeBufferTooSmall
143 typedef enum XMLElementType
161 XMLCSTR lpszValue; XMLCSTR lpszOpenTag; XMLCSTR lpszCloseTag;
166 XMLCSTR lpszName; XMLCSTR lpszValue;
175 struct XMLNodeDataTag;
182 XMLNode(
struct XMLNodeDataTag *pParent, XMLSTR lpszName,
char isDeclaration);
183 XMLNode(
struct XMLNodeDataTag *p);
190 static XMLNode createXMLTopNode(XMLCSTR lpszName,
char isDeclaration=FALSE);
191 static XMLNode parseString (XMLCSTR lpXMLString, XMLCSTR tag=NULL,
XMLResults *pResults=NULL);
192 static XMLNode parseFile (XMLCSTR filename, XMLCSTR tag=NULL,
XMLResults *pResults=NULL);
193 static XMLNode openFileHelper(XMLCSTR filename, XMLCSTR tag=NULL );
215 static XMLCSTR getError(XMLError error);
216 static XMLCSTR getVersion();
218 XMLCSTR getName()
const;
219 XMLCSTR getText(
int i=0)
const;
222 XMLNode getChildNode(
int i=0)
const;
223 XMLNode getChildNode(XMLCSTR name,
int i)
const;
225 XMLNode getChildNode(XMLCSTR name,
int *i=NULL)
const;
227 XMLNode getChildNodeWithAttribute(XMLCSTR tagName,
228 XMLCSTR attributeName,
229 XMLCSTR attributeValue=NULL,
231 int nChildNode(XMLCSTR name)
const;
232 int nChildNode()
const;
234 XMLCSTR getAttributeName(
int i=0)
const;
235 XMLCSTR getAttributeValue(
int i=0)
const;
236 char isAttributeSet(XMLCSTR name)
const;
237 XMLCSTR getAttribute(XMLCSTR name,
int i)
const;
239 XMLCSTR getAttribute(XMLCSTR name,
int *i=NULL)
const;
241 int nAttribute()
const;
244 XMLSTR createXMLString(
int nFormat=1,
int *pnSize=NULL)
const;
249 XMLError writeToFile(XMLCSTR filename,
const char *encoding=NULL,
char nFormat=1)
const;
263 int nElement()
const;
264 char isEmpty()
const;
265 char isDeclaration()
const;
268 #pragma warning(disable: 4800) // warning: forcing value to bool
269 bool operator !(){
return isEmpty(); }
286 XMLNode addChild(XMLCSTR lpszName,
char isDeclaration=FALSE,
int pos=-1);
287 XMLAttribute *addAttribute(XMLCSTR lpszName, XMLCSTR lpszValuev);
288 XMLCSTR addText(XMLCSTR lpszValue,
int pos=-1);
289 XMLClear *addClear(XMLCSTR lpszValue, XMLCSTR lpszOpen=NULL, XMLCSTR lpszClose=NULL,
int pos=-1);
295 XMLCSTR updateName(XMLCSTR lpszName);
297 XMLAttribute *updateAttribute(XMLCSTR lpszNewValue, XMLCSTR lpszNewName=NULL,
int i=0);
298 XMLAttribute *updateAttribute(XMLCSTR lpszNewValue, XMLCSTR lpszNewName,XMLCSTR lpszOldName);
300 XMLCSTR updateText(XMLCSTR lpszNewValue,
int i=0);
301 XMLCSTR updateText(XMLCSTR lpszNewValue, XMLCSTR lpszOldValue);
302 XMLClear *updateClear(XMLCSTR lpszNewContent,
int i=0);
304 XMLClear *updateClear(XMLCSTR lpszNewValue, XMLCSTR lpszOldValue);
307 void deleteNodeContent();
308 void deleteAttribute(XMLCSTR lpszName);
309 void deleteAttribute(
int i=0);
311 void deleteText(
int i=0);
312 void deleteText(XMLCSTR lpszValue);
313 void deleteClear(
int i=0);
315 void deleteClear(XMLCSTR lpszValue);
336 static XMLNode createXMLTopNode_WOSD(XMLSTR lpszName,
char isDeclaration=FALSE);
337 XMLNode addChild_WOSD(XMLSTR lpszName,
char isDeclaration=FALSE,
int pos=-1);
338 XMLAttribute *addAttribute_WOSD(XMLSTR lpszName, XMLSTR lpszValue);
339 XMLCSTR addText_WOSD(XMLSTR lpszValue,
int pos=-1);
340 XMLClear *addClear_WOSD(XMLSTR lpszValue, XMLCSTR lpszOpen=NULL, XMLCSTR lpszClose=NULL,
int pos=-1);
342 XMLCSTR updateName_WOSD(XMLSTR lpszName);
344 XMLAttribute *updateAttribute_WOSD(XMLSTR lpszNewValue, XMLSTR lpszNewName=NULL,
int i=0);
345 XMLAttribute *updateAttribute_WOSD(XMLSTR lpszNewValue, XMLSTR lpszNewName,XMLCSTR lpszOldName);
346 XMLCSTR updateText_WOSD(XMLSTR lpszNewValue,
int i=0);
347 XMLCSTR updateText_WOSD(XMLSTR lpszNewValue, XMLCSTR lpszOldValue);
348 XMLClear *updateClear_WOSD(XMLSTR lpszNewContent,
int i=0);
350 XMLClear *updateClear_WOSD(XMLSTR lpszNewValue, XMLCSTR lpszOldValue);
355 int positionOfText(
int i=0)
const;
356 int positionOfText(XMLCSTR lpszValue)
const;
357 int positionOfClear(
int i=0)
const;
358 int positionOfClear(XMLCSTR lpszValue)
const;
359 int positionOfClear(
XMLClear *a)
const;
360 int positionOfChildNode(
int i=0)
const;
361 int positionOfChildNode(
XMLNode x)
const;
362 int positionOfChildNode(XMLCSTR name,
int i=0)
const;
402 typedef enum XMLCharEncoding { encoding_UTF8=1, encoding_ascii=2, encoding_ShiftJIS=3 } XMLCharEncoding;
404 static char setGlobalOptions(XMLCharEncoding characterEncoding=XMLNode::encoding_UTF8,
char guessWideCharChars=1,
char dropWhiteSpace=1);
417 static XMLCharEncoding guessCharEncoding(
void *buffer,
int bufLen,
char useXMLEncodingAttribute=1);
423 typedef struct XMLNodeDataTag
431 struct XMLNodeDataTag *pParent;
441 char parseClearTag(
void *px,
void *pa);
442 char maybeAddTxT(
void *pa, XMLCSTR tokenPStr);
443 int ParseXMLElement(
void *pXML);
444 void *addToOrder(
int memInc,
int *_pos,
int nc,
void *p,
int size, XMLElementType xtype);
445 int indexText(XMLCSTR lpszValue)
const;
446 int indexClear(XMLCSTR lpszValue)
const;
447 XMLNode addChild_priv(
int,XMLSTR,
char,
int);
449 XMLCSTR addText_priv(
int,XMLSTR,
int);
450 XMLClear *addClear_priv(
int,XMLSTR,XMLCSTR,XMLCSTR,
int);
451 void deleteNodeContent_priv(
char,
char);
452 static inline int findPosition(XMLNodeData *d,
int index, XMLElementType xtype);
453 static int CreateXMLStringR(XMLNodeData *pEntry, XMLSTR lpszMarker,
int nFormat);
454 static int removeOrderElement(XMLNodeData *d, XMLElementType t,
int index);
455 static void exactMemory(XMLNodeData *d);
456 static int detachFromParent(XMLNodeData *d);
463 enum XMLElementType type;
473 XMLDLLENTRY
void freeXMLString(XMLSTR t);
478 XMLDLLENTRY XMLSTR stringDup(XMLCSTR source,
int cbData=0);
495 XMLSTR toXML(XMLCSTR source);
500 static XMLSTR toXMLUnSafe(XMLSTR dest,XMLCSTR source);
525 static int encodeLength(
int inBufLen,
char formatted=0);
531 XMLSTR encode(
unsigned char *inByteBuf,
unsigned int inByteLen,
char formatted=0);
534 static unsigned int decodeSize(XMLCSTR inString, XMLError *xe=NULL);
540 unsigned char* decode(XMLCSTR inString,
int *outByteLen=NULL, XMLError *xe=NULL);
546 static unsigned char decode(XMLCSTR inString,
unsigned char *outByteBuf,
int inMaxByteOutBuflen, XMLError *xe=NULL);
551 void alloc(
int newsize);