// file: $isip/class/mmedia/XMLParser/xp_06.cc // version: $Id: xp_06.cc 10284 2005-10-27 20:52:14Z wholland $ #if defined(HAVE_EXPAT) #include "XMLParser.h" // method: addToken // // arguments: // XMLToken token: an XML token to be added to the expansion // // return: a bool8 indicating status // // concats a token to the token vector, and checks for // start_and_end_tags. // bool8 XMLParser::addToken(XMLToken token_a) { // add the new tag to the expansion, if it is not a CDATA // tag immediately following another CDATA tag // // if length() = 5, index of last element is 4 // // do not allow the vector to access anything out of bounds // if(token_vector_d.length() >=1) { // if the previous tag was a start tag, and this tag is an end tag, // with no other data in between, combine the two tags as follows: // => // if (token_vector_d(token_vector_d.length()-1).getType() == XMLToken::START_TAG && token_a.getType() == XMLToken::END_TAG) { token_vector_d(token_vector_d.length()-1) .setType(XMLToken::START_AND_END_TAG); // indicate success // return true; } } // note that execution does not reach this point in the case of // sequential CDATA tags. Therefore, no CDATA tags after the first // in any sequence will increase the lengh of the vector. They will // be combined into a single CDATA tag. // return token_vector_d.concat(token_a); } // method: parseXML // // arguments: // String document: (input) an xml format document // // return: a bool8 indicating status // bool8 XMLParser::parseXML(String document_a) { // clear the parser, and initialize it for reuse // token_vector_d.clear(Integral::RESET); this->Create(); // remove all leading and trailing white space from the string, // since an end line before a statement will break the // expat parse // document_a.trim(); // parse the entire document at once. inform expat that // this is the final parse (true) // so that it will check for well formedness. The -1 here // forces Parse to dynamically check for the size of the // string passed to it, (as opposed to parsing a positive // fixed number of bytes) // if(!this->Parse((char*)(byte8*)document_a, -1, true)) { document_a.debug(L"document_a->"); return Error::handle(name(), L"Parse Failed. Check document for well formednes", Error::TEST, __FILE__, __LINE__); } if(debug_level_d > Integral::DETAILED) { Console::put(L"The parsed document:"); Console::increaseIndention(); Console::put(toXML()); Console::decreaseIndention(); } // filter out non-handled tokens, if a list of // valid values has been specified. // if(valid_values_d.length() > 0) { removeUnhandledTokens(); } // ensure that the depths are correct before exiting // setTokenDepths(); if(debug_level_d > Integral::DETAILED) { Console::put(L"The document after removal of unwanted tags:"); Console::increaseIndention(); Console::put(toXML()); Console::decreaseIndention(); } // exit gracefully // return true; } #endif