diff options
Diffstat (limited to 'include/utilxml.h')
-rw-r--r-- | include/utilxml.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/include/utilxml.h b/include/utilxml.h new file mode 100644 index 0000000..dc5e9d8 --- /dev/null +++ b/include/utilxml.h @@ -0,0 +1,88 @@ +/****************************************************************************** + * utilxml.h - definition of class that deal with xml constructs + * + * $Id: utilxml.h 2096 2007-10-07 00:40:00Z scribe $ + * + * Copyright 1998 CrossWire Bible Society (http://www.crosswire.org) + * CrossWire Bible Society + * P. O. Box 2528 + * Tempe, AZ 85280-2528 + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation version 2. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + */ + +#ifndef UTILXML_H +#define UTILXML_H + +#include <defs.h> +#include <swbuf.h> +#include <list> +#include <map> + +SWORD_NAMESPACE_START + +typedef std::map<SWBuf, SWBuf> StringPairMap; +typedef std::list<SWBuf> StringList; + +/** Simple XML helper class. +*/ +class SWDLLEXPORT XMLTag { +private: + mutable char *buf; + char *name; + mutable bool parsed; + mutable bool empty; + mutable bool endTag; + mutable StringPairMap attributes; + mutable SWBuf junkBuf; + + void parse() const; + const char *getPart(const char *buf, int partNum = 0, char partSplit = '|') const; + static const char *nullstr; + +public: + XMLTag(const char *tagString = 0); + ~XMLTag(); + + void setText(const char *tagString); + inline const char *getName() const { return (name)?name:nullstr; } + + inline bool isEmpty() const { + if (!parsed) + parse(); + + return empty; + } + inline void setEmpty(bool value) { + if (!parsed) + parse(); + empty = value; + if (value) + endTag = false; + } + + inline bool isEndTag() const { return endTag; } + + const StringList getAttributeNames() const; + int getAttributePartCount(const char *attribName, char partSplit = '|') const; + + // return values should not be considered to persist beyond the return of the function. + const char *getAttribute(const char *attribName, int partNum = -1, char partSplit = '|') const; + const char *setAttribute(const char *attribName, const char *attribValue, int partNum = -1, char partSplit = '|'); + const char *toString() const; + inline operator const char *() const { return toString(); } + inline XMLTag & operator =(const char *tagString) { setText(tagString); return *this; } + inline XMLTag & operator =(const XMLTag &other) { setText(other.toString()); return *this; } +}; + +SWORD_NAMESPACE_END +#endif + |