Sajit Zachariah wrote:
Hi,

I am using XercesC 2.8.0.
I parse an XML string using the following method
...
      XMLCh* xmlString =
XMLString::transcode(_xmlString);
                XMLByte* strByte =
(XMLByte*)pLCPTranscoder->transcode(xmlString);

                MemBufInputSource xmlBuffer (strByte
,strlen(_xmlString)
                     ,XMLString::transcode("strXML")
,false);
Some comments unrelated to your crash:

1. Don't you think it's a bit confusing to have a variable xmlString that shadows the formal parameter xmlString?

2. There is no difference between using XMLString::transcode() and using a local code page transcoder, so you don't need to mix the two.

3. Please make sure the string you pass in is encoded in the local code page. Otherwise, you are asking for trouble. It would be far better, easier, and safer to pass the char* into the MemBufInputSource instance, and let the parser figure out the document's encoding.

4. The call to XMLString::transcode("strXML") is a memory leak. If you really are going to use an invariant string for the system ID, it would be better to create a wide character string using the static constants in xercesc/util/XMLUniDefs.hpp:

const XMLCh  systemID[] =
{
    chLatin_s,
    chLatin_t,
    chLatin_r,
    chLatin_X,
    chLatin_M,
    chLatin_L,
    chNull
};


                ao_Parser->parse( xmlBuffer );
      DOMNode* domNode =   ao_Parser->adoptDocument();
      // MEM_LEAK_CHECK - Delete added, Release memory
      XMLString::release(&xmlString);
      XMLString::release(&strByte);
      if(ao_Parser)
         delete ao_Parser;
There is no way ao_Parser can ever be a null pointer in your code. And even if it is, you never have to check before deleting a null pointer.


      return domNode;
   }
   catch (const OutOfMemoryException& oe)
   {
      // MEM_LEAK_CHECK - Delete added
      if(ao_Parser)
         delete ao_Parser;
ditto...
       XERCES_STD_QUALIFIER cerr <<
"OutOfMemoryException" << XERCES_STD_QUALIFIER endl;
       errorsOccured = true;
   }
   catch (const XMLException& e)
   {
      // MEM_LEAK_CHECK - Delete added
      if(ao_Parser)
         delete ao_Parser;
ditto...
      XERCES_STD_QUALIFIER cerr << "An error occurred
during parsing "
               << XERCES_STD_QUALIFIER endl ;

      errorsOccured = true;
   }
   catch (const DOMException& e)
   {
      // MEM_LEAK_CHECK - Delete added
      if(ao_Parser)
         delete ao_Parser;
ditto...
      XERCES_STD_QUALIFIER cerr << "DOMException code
is:  " << e.code << XERCES_STD_QUALIFIER endl;
   }

   catch (...)
   {
      // MEM_LEAK_CHECK - Delete added
      if(ao_Parser)
         delete ao_Parser;
ditto...
      XERCES_STD_QUALIFIER cerr << "An error occurred
during parsing\n " << XERCES_STD_QUALIFIER endl;
       errorsOccured = true;
   }
    // END OF PARSING
}
There is a very nice class in Xerces-C called Janitor (xercesc/util/Janitor.hpp that implements an auto_ptr-like class that can clean up the parser instance for you, instead of worrying about deleting it. You can grep the code for "Janitor" to see how it's used.


returned node is again iterated and I create a
composite of the domnode for the use. And finally when
I try to delete the node a access violation exception
is thrown. Please note that I am using Borland C++
Builder
Please see the code that calls the above method

void ClXMLBase::loadXmlString(char* _cn_xmlString)
{

   int i_StringLen = strlen(_cn_xmlString);

   if(i_StringLen!=0)
{ ClXMLDOMParser o_DOMParser;
      m_RootNode =
o_DOMParser.loadString(_cn_xmlString);//call to load
string
      DOMNodeList* ao_Node_List =
m_RootNode->getChildNodes();

      for(int i=0; i < (int)ao_Node_List->getLength();
i++)
      {
         DOMNode* ao_ParentNode =
ao_Node_List->item(i);

         if(ao_ParentNode == NULL ||
ao_ParentNode->getNodeType() != DOMNode::ELEMENT_NODE)
            continue;

         this->parse(ao_ParentNode);
      }

   }
   // m_RootNode->release(); //This works ut if I call
releaseNode() just after this loadXmlstring with the
object it crashes
This could be caused my many things. Perhaps your previous code has an error and the heap is corrupted. Perhaps some other code has already released the DOMDocument instance. I would suggest some debugging with a good debugger and heap-checking library. I'm not sure what your "parse" member function does, but if you comment that call out, and you don't experience a crash, then I'd say that's the culprit.

Dave

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to