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
00036 #include "OW_config.h"
00037 #include "OW_XMLParserDOM.hpp"
00038 #include "OW_XMLParserSAX.hpp"
00039 #include "OW_XMLNode.hpp"
00040 #include "OW_XMLParserCore.hpp"
00041 #include "OW_XMLParseException.hpp"
00042 #include "OW_Format.hpp"
00043 #include "OW_ExceptionIds.hpp"
00044
00045 namespace OW_NAMESPACE
00046 {
00047
00048 OW_DEFINE_EXCEPTION_WITH_ID(DOM);
00049
00050 using std::istream;
00051
00052 namespace
00053 {
00054
00055 class DOMDocumentBuilder : public XMLParserSAX::SAXDocumentHandler
00056 {
00057 public:
00058 virtual void endDocument()
00059 {
00060 }
00061 virtual void startElement(const XMLToken &entry)
00062 {
00063 XMLAttributeArray newAttrArray;
00064 unsigned int len = entry.attributeCount;
00065 for (unsigned int index = 0; index < len; index++)
00066 {
00067 String nodeName = entry.attributes[index].name.toString();
00068 String nodeValue = entry.attributes[index].value.toString();
00069
00070 XMLAttribute newAttribute(nodeName, nodeValue);
00071 newAttrArray.append(newAttribute);
00072 }
00073
00074 XMLNode newNode(entry.text.toString(), newAttrArray);
00075
00076 if (newNode)
00077 {
00078 if (!m_topNode)
00079 {
00080 m_topNode = newNode;
00081 }
00082
00083
00084 if (m_nodeArray.size() > 0)
00085 {
00086 XMLNode parent = m_nodeArray[m_nodeArray.size() - 1];
00087 parent.addChild(newNode);
00088 }
00089
00090 m_nodeArray.push_back(newNode);
00091 }
00092 }
00093
00094
00095 virtual void endElement(const StringBuffer &name)
00096 {
00097
00098
00099 m_nodeArray.pop_back();
00100 }
00101
00102 virtual void characters(const StringBuffer &chars)
00103 {
00104 if (m_nodeArray.size() > 0)
00105 {
00106 XMLNode curNode = m_nodeArray[m_nodeArray.size() - 1];
00107 if (curNode != 0)
00108 {
00109 String utxt = chars.toString();
00110 curNode.appendText(utxt);
00111 }
00112 }
00113 }
00114 virtual void startDocument()
00115 {
00116 }
00117
00118 XMLNode getDocument() const
00119 {
00120 return m_topNode;
00121 }
00122
00123 private :
00124
00125 XMLNode m_currentNode;
00126 XMLNode m_topNode;
00127 XMLNodeArray m_nodeArray;
00128
00129 };
00130
00131 class DOMErrorHandler : public XMLParserSAX::SAXErrorHandler
00132 {
00133 public:
00134 virtual void warning(const XMLParseException &exception)
00135 {
00136 }
00137 virtual void error(const XMLParseException &exception)
00138 {
00139 OW_THROW(DOMException, Format("Error in XML: "
00140 "line %1, Message: %3",
00141 exception.getLine(),
00142 exception.getMessage()).c_str());
00143 }
00144 virtual void fatalError(const XMLParseException &exception)
00145 {
00146 OW_THROW(DOMException, Format("Fatal error in XML: "
00147 "line %1, Message: %2",
00148 exception.getLine(),
00149 exception.getMessage()).c_str());
00150 }
00151 };
00152
00153 }
00154
00155 namespace XMLParserDOM
00156 {
00157
00158 XMLNode
00159 parse(const String& xmlData)
00160 {
00161 DOMDocumentBuilder docHandler;
00162 DOMErrorHandler errHandler;
00163 XMLParserSAX::parse(xmlData, docHandler, errHandler);
00164 XMLNode rv = docHandler.getDocument();
00165 if (!rv)
00166 {
00167 OW_THROW(DOMException, "No document found");
00168 }
00169 return rv;
00170 }
00171
00172 XMLNode
00173 parse(istream& data)
00174 {
00175 DOMDocumentBuilder docHandler;
00176 DOMErrorHandler errHandler;
00177 XMLParserSAX::parse(data, docHandler, errHandler);
00178 XMLNode rv = docHandler.getDocument();
00179 if (!rv)
00180 {
00181 OW_THROW(DOMException, "No document found");
00182 }
00183 return rv;
00184 }
00185
00186 }
00187 }
00188
00189