You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by Guillaume <gu...@trias.fr> on 2002/11/08 12:02:49 UTC

Problem with setNamedItem

Hi,

I'm using Xerces distrib 2.1.0 in a c++ application on MacOS 9.2. There is my code for parse a xml file :

// ------------------------------------------------------------------
// 
// ------------------------------------------------------------------

OSErr XercesProcessFileTest(char* fileIn)
{
 char*   Message = NULL;
 Str255   theFile;
 int32   NbArticles;
 char*    TestContenu = NULL;
 const char*                xmlFile = 0;
    AbstractDOMParser::ValSchemes valScheme = AbstractDOMParser::Val_Auto;
    bool                       doNamespaces       = false;
    bool                       doSchema           = false;
    bool                       schemaFullChecking = false;
    bool                       doList = false;
    bool                       errorOccurred = false;

 DOMNode   *ArticleNode;
 DOMNode   *TexteNode;
 DOMNode   *GestionNode;
 DOMNamedNodeMap *MapArticle;
 DOMNamedNodeMap *MapGestion;
  
 #if MACOS
  int16   i;

  STRCPY(theFile, "\p/");
  STRCAT(theFile, (uchar*)fileIn);
  // Now replace ':' by '/'
  for(int16 i = 1; i <= theFile[0]; i++) {
   if(theFile[i] == ':')
    theFile[i] = '/';
  }
  
  P2CSTR(theFile);
 #else
  STRCPY(theFile, fileIn); 
 #endif 

 try{
  GetInfos();
        XMLPlatformUtils::Initialize();
    }
    catch(const XMLException &toCatch) {
  Message = XMLString::transcode(toCatch.getMessage());
        MessageBox(NULL, P_CHAR Message, STR_ERROR, MB_ICONINFORMATION | MB_OK);
  if(Message)
   delete Message;
  Message = NULL;
    }


 // Creation et configuration du parser.
 {
  DOMDocument  *doc = 0;
  static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
     DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(gLS);
     DOMBuilder        *parser = ((DOMImplementationLS*)impl)->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS, 0);
  
  parser->setFeature(XMLUni::fgDOMNamespaces, doNamespaces);
     parser->setFeature(XMLUni::fgXercesSchema, doSchema);
     parser->setFeature(XMLUni::fgXercesSchemaFullChecking, schemaFullChecking);

     if (valScheme == AbstractDOMParser::Val_Auto)
     {
         parser->setFeature(XMLUni::fgDOMValidateIfSchema, true);
     }
     else if (valScheme == AbstractDOMParser::Val_Never)
     {
         parser->setFeature(XMLUni::fgDOMValidation, false);
     }
     else if (valScheme == AbstractDOMParser::Val_Always)
     {
         parser->setFeature(XMLUni::fgDOMValidation, true);
     }

     // enable datatype normalization - default is off
     parser->setFeature(XMLUni::fgDOMDatatypeNormalization, true);

     // And create our error handler and install it
     MyErrorHandler2 errorHandler;
     parser->setErrorHandler(&errorHandler);
  errorHandler.resetErrors();

  //Parsage et interception des erreurs
     try{
      parser->resetDocumentPool();
      doc = parser->parseURI((char*)theFile);    
     }
     catch (const XMLException& e) {
   Message = XMLString::transcode(e.getMessage());
         MessageBox(NULL, P_CHAR Message, STR_ERROR_PARSE, MB_OK|MB_ICONEXCLAMATION);
         errorOccurred = true;
   if(Message)
    delete Message;
   Message = NULL;
     }
     catch (const DOMException& e) {
   Str255 StrMessage;
   STRCPY(StrMessage, P_CHAR (e.code));
         MessageBox(NULL, P_CHAR StrMessage, STR_ERROR_PARSE, MB_OK|MB_ICONEXCLAMATION);
         errorOccurred = true;
     }
     catch (...) {
         MessageBox(NULL, STR_ERROR_PARSE, STR_ERROR_PARSE, MB_OK|MB_ICONEXCLAMATION);
         errorOccurred = true;
     }

  if ((!errorOccurred) && (!errorHandler.getSawErrors())) {
   if (doc) {    
     NbArticles = (doc->getElementsByTagName((XMLString::transcode((char*)STR_TAG_STORY))))->getLength();
    if (NbArticles == 0) {
     MessageBox(NULL, STR_ERROR_NOSTORY, STR_ERROR, MB_OK|MB_ICONEXCLAMATION);
     return -1;
    }
    // On prend le 1er élément <ARTICLE>
    ArticleNode = (doc->getElementsByTagName((XMLString::transcode((char*)STR_TAG_STORY))))->item(0);
    // On le mape
    MapArticle = getMap(ArticleNode);

    // On prend l'élément <GESTION>
    GestionNode = MapArticle->getNamedItem((XMLString::transcode((char*)STR_TAG_GESTION)));
    MapGestion = getMap(GestionNode);
    
    // Here we call a funtion that write the text in a window....
   }
  }

     // Delete the parser itself.  Must be done prior to calling Terminate, below.
     parser->release();
    
 }
 
 // Deinit Xerces
 XMLPlatformUtils::Terminate();
 
 return noErr;
}

// ------------------------------------------------------------------
// Renvoit la map d'une node
// ------------------------------------------------------------------
DOMNamedNodeMap* getMap(DOMNode* Node)
{
 DOMNamedNodeMap *map = Node->getAttributes();
 DOMNodeList  *liste = Node->getChildNodes();
 DOMNode   *node;
 int    i;

 int taille = liste->getLength();

 for (i=0 ;i<taille;i++){
 
  try {
   node = liste->item(i)->cloneNode(true);
  }
  catch (const DOMException& e) {
   Str255 StrMessage1;
   STRCPY(StrMessage1, P_CHAR (e.code));
   MessageBox(NULL, P_CHAR StrMessage1, STR_ERROR_PARSE, MB_OK|MB_ICONEXCLAMATION);
  }
     
     
  try {
   map->setNamedItem(node); // Here is the error, I go into catch below but e.code has a value
                            // far too high for a normal DOMException error code
  }
  catch (const DOMException& e) {
   Str255 StrMessage2;
   STRCPY(StrMessage2, P_CHAR (e.code));
   MessageBox(NULL, P_CHAR StrMessage2, STR_ERROR_PARSE, MB_OK|MB_ICONEXCLAMATION);
   }

 return map;
}

This function "getmap" was correct with old distrib 1.7.0. What's wrong today ?

Guillaume