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
00031
00032
00033
00034 #include "pana_xml_errorreporter.h"
00035 #include "pana_xml_parser.h"
00036 #include <xercesc/util/PlatformUtils.hpp>
00037 #include <xercesc/util/XMLString.hpp>
00038 #include <xercesc/parsers/XercesDOMParser.hpp>
00039
00040 PANA_XMLElementParser::PANA_XMLElementParser(std::string &tagName)
00041 {
00042 name_ = tagName;
00043 }
00044
00045 int PANA_XMLElementParser::populate(DOMNode *n, DOMNode **found)
00046 {
00047 DOMNode *sibling = n;
00048 while (sibling != NULL) {
00049
00050 if (sibling->getNodeType() == DOMNode::ELEMENT_NODE) {
00051
00052 char *c_str = XMLString::transcode(sibling->getNodeName());
00053
00054 if (XMLString::compareString(c_str, name_.c_str()) == 0) {
00055
00056 XMLString::release(&c_str);
00057
00058 if (found) {
00059 *found = sibling;
00060 }
00061
00062 return svc(sibling);
00063 }
00064
00065 XMLString::release(&c_str);
00066 }
00067 sibling = sibling->getNextSibling();
00068 }
00069 return (-1);
00070 }
00071
00072 char *PANA_XMLElementParser::getTextContent(DOMNode *n)
00073 {
00074 DOMNode *child = n->getFirstChild();
00075 if (child && child->getNodeType() == DOMNode::TEXT_NODE) {
00076
00077 const XMLCh *xmlCh = child->getNodeValue();
00078 if (xmlCh) {
00079 return XMLString::transcode(xmlCh);
00080 }
00081 }
00082 return (NULL);
00083 }
00084
00085 int PANA_XMLTreeParser::open(std::string &filename, PANA_XMLElementParser &root)
00086 {
00087 int rcode = (-1);
00088
00089 try {
00090 XMLPlatformUtils::Initialize();
00091
00092 XercesDOMParser parser;
00093 XMLDOMTreeErrorReporter errReporter;
00094
00095 parser.setValidationScheme(XercesDOMParser::Val_Always);
00096 parser.setDoNamespaces(true);
00097 parser.setDoSchema(true);
00098 parser.setErrorHandler(&errReporter);
00099
00100 try {
00101 parser.parse(filename.data());
00102
00103 if (parser.getErrorCount() == 0) {
00104 DOMNode *doc = parser.getDocument();
00105 rcode = root.populate(doc->getFirstChild());
00106 }
00107 }
00108 catch (const DOMException& e) {
00109 ACE_UNUSED_ARG(e);
00110 }
00111 catch (const XMLException& e) {
00112 ACE_UNUSED_ARG(e);
00113 }
00114 }
00115 catch (const XMLException& toCatch) {
00116 ACE_UNUSED_ARG(toCatch);
00117 }
00118
00119 close();
00120 return (rcode);
00121 }
00122
00123 void PANA_XMLTreeParser::close()
00124 {
00125 XMLPlatformUtils::Terminate();
00126 }
00127
00128 int PANA_XMLDataString::svc(DOMNode *n)
00129 {
00130 char *c_str = getTextContent(n);
00131 if (c_str) {
00132 payload.assign(c_str);
00133 XMLString::release(&c_str);
00134 return (0);
00135 }
00136 return (-1);
00137 }
00138
00139 int PANA_XMLDataUInt32::svc(DOMNode *n)
00140 {
00141 char *c_str = getTextContent(n);
00142 if (c_str) {
00143 payload = ACE_OS::atoi(c_str);
00144 XMLString::release(&c_str);
00145 return (0);
00146 }
00147 return (-1);
00148 }
00149
00150
00151
00152