00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00035 #ifndef OW_XMLPARSERCORE_HPP_INCLUDE_GUARD_
00036 #define OW_XMLPARSERCORE_HPP_INCLUDE_GUARD_
00037 #include "OW_config.h"
00038 #include "OW_String.hpp"
00039 #include "OW_StringBuffer.hpp"
00040 #include "OW_IstreamBufIterator.hpp"
00041 #include <stack>
00042 #include <iosfwd>
00043
00044 namespace OW_NAMESPACE
00045 {
00046
00048 struct OW_XML_API XMLToken
00049 {
00050 XMLToken() : type(INVALID), text(8096), attributeCount(0)
00051 {}
00052 enum XMLType
00053 {
00054 INVALID,
00055 XML_DECLARATION,
00056 START_TAG,
00057 END_TAG,
00058 COMMENT,
00059 CDATA,
00060 DOCTYPE,
00061 CONTENT
00062 };
00063 struct OW_XML_API Attribute
00064 {
00065 Attribute(): name(64), value(512)
00066 {
00067 }
00068 StringBuffer name;
00069 StringBuffer value;
00070 };
00071 enum { MAX_ATTRIBUTES = 10 };
00072 XMLType type;
00073 StringBuffer text;
00074 Attribute attributes[MAX_ATTRIBUTES];
00075 unsigned int attributeCount;
00076 };
00077
00079 class OW_XML_API XMLParserCore
00080 {
00081 public:
00082 XMLParserCore(std::istream& input) : m_line(1), m_current(), m_foundRoot(false), m_tagIsEmpty(false)
00083 {
00084 setInput(input);
00085 }
00086 XMLParserCore(): m_line(1), m_current(), m_foundRoot(false), m_tagIsEmpty(false)
00087 {
00088 }
00089 ~XMLParserCore()
00090 {
00091 }
00092 void setInput(std::istream& input)
00093 {
00094 m_current = IstreamBufIterator(input);
00095 }
00096 bool next(XMLToken& entry);
00097 unsigned int getLine() const
00098 {
00099 return m_line;
00100 }
00101 private:
00102 void skipWhitespace();
00103 bool getElementName(XMLToken& entry);
00104 bool getOpenElementName(XMLToken& entry, bool& openCloseElement);
00105 void getAttributeNameAndEqual(XMLToken::Attribute& att);
00106 void getAttributeValue(XMLToken::Attribute& att);
00107 void getComment();
00108 void getCData(XMLToken& entry);
00109 void getDocType();
00110 void getContent(XMLToken& entry);
00111 void getElement(XMLToken& entry);
00112
00113 #ifdef OW_WIN32
00114 #pragma warning (push)
00115 #pragma warning (disable: 4251)
00116 #endif
00117
00118 unsigned int m_line;
00119 IstreamBufIterator m_current;
00120
00121
00122
00123 std::stack<String> m_stack;
00124 bool m_foundRoot;
00125 bool m_tagIsEmpty;
00126
00127 #ifdef OW_WIN32
00128 #pragma warning (pop)
00129 #endif
00130
00131 };
00132
00133 }
00134
00135 #endif