Uploaded image for project: 'Xerces-C++'
  1. Xerces-C++
  2. XERCESC-997

it is not possible to parse a file and edit it after

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Resolution: Incomplete
    • 2.3.0
    • None
    • Non-Validating Parser
    • None
    • Operating System: Linux
      Platform: PC
    • 22959

    Description

      Hi,

      I get the following problem with xercesc which seems to be a bug: it is not
      possible to parse a file and edit it after (I believe that it is a bug but I
      must confess that my knowledge of xerces is not realy good).

      Xercesc version number: 2.3.0 which I build myself (using gcc following
      exactly the instructions command line of your web page).
      Platform: Linux
      Operating system: RedHat 9

      Compiler: version gcc 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

      XML Document that failed:

      <?xml version="1.0" encoding="UTF-8" standalone="no" ?><!DOCTYPE PollQ
      SYSTEM "PollQ.dtd"><PollQ><Question
      Comment="FALSE"><QData>TEST</QData><Answer>TEST</Answer></Question></PollQ>

      DTD "PollQ.dtd":

      <!ELEMENT PollQ (Question)+>
      <!ELEMENT Question (QData, Answers*)>
      <!ELEMENT QData (#PCDATA)>
      <!ELEMENT Answer (#PCDATA)>
      <!ATTLIST Question Comment (TRUE|FALSE) #REQUIRED>

      C++ Code that failed:

      That's the constructor of a window (using wxWindow lib)

      PollFrame::PollFrame(const wxChar *title, const wxString path, int xpos, int
      ypos, int width, int height)
      :wxFrame((wxFrame *) NULL, -1, title, wxPoint(xpos,ypos), wxSize
      (width, height)),
      PollPath(path), MenuBar(new wxMenuBar()), FileMenu(new wxMenu
      ()),
      EditMenu(new wxMenu()), data(new wxTextCtrl(this, -1, wxString
      (""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_READONLY)),
      nq(0U), na(0U), tmp1(new XMLCh[100]), tmp2(new XMLCh[100])
      {
      // ...

      // Some wxWindows init (not needed) like menu etc...

      // ....

      // Start the data analysis

      XERCES_CPP_NAMESPACE::XMLPlatformUtils::Initialize();

      // the parser
      XERCES_CPP_NAMESPACE::XMLString::transcode("LS", tmp1, 99);
      impl=XERCES_CPP_NAMESPACE::DOMImplementationRegistry::getDOMImplementat
      ion(tmp1);
      p = impl->createDOMBuilder
      (XERCES_CPP_NAMESPACE::DOMImplementationLS::MODE_SYNCHRONOUS, 0);
      XERCES_CPP_NAMESPACE::XMLString::transcode("entities", tmp1, 99);
      p->setFeature(tmp1, false);

      // the serializer
      Serializer=impl->createDOMWriter();
      XERCES_CPP_NAMESPACE::XMLString::transcode("\n", tmp1, 99);
      Serializer->setNewLine(tmp1);

      if(path.IsEmpty()) // if new xml file (NO PROBLEM)

      { XERCES_CPP_NAMESPACE::XMLString::transcode("PollQ", tmp1, 99); XERCES_CPP_NAMESPACE::XMLString::transcode("PollQ.dtd", tmp2, 99); Doctype=impl->createDocumentType(tmp1, NULL, tmp2); Doc=impl->createDocument(NULL, tmp1, Doctype); root=Doc->getDocumentElement(); }

      else // not new so whant to parse (PROBLEM)
      {
      Target= new XERCES_CPP_NAMESPACE::LocalFileFormatTarget
      (static_cast<const char *>(PollPath));
      XERCES_CPP_NAMESPACE::XMLString::transcode(static_cast<const
      char *>(PollPath), tmp1, 99);
      try

      { Doc=p->parseURI(tmp1); }

      catch(const XERCES_CPP_NAMESPACE::XMLException& e)

      { wxString m = XERCES_CPP_NAMESPACE::XMLString::transcode (e.getMessage()); wxLogMessage("Exception: "+m+"\n"); }

      catch(const XERCES_CPP_NAMESPACE::DOMException& e)

      { wxString m = XERCES_CPP_NAMESPACE::XMLString::transcode (e.msg); wxLogMessage("Exception: "+m+"\n"); }

      catch(...)

      { wxLogMessage("Exception inconnu\n"); }

      // no catch so should be OK

      Doctype=Doc->getDoctype();
      root=Doc->getDocumentElement();
      }
      }

      // when I whant to add an element then I call this function

      void PollFrame::EditAddQ(wxCommandEvent &event)
      {
      AddQDialog *Qdlg = new AddQDialog(this); // that's the dialog from
      witch I get data
      if(Qdlg->ShowModal() == wxID_OK)
      {
      // set question
      XERCES_CPP_NAMESPACE::XMLString::transcode("Question", tmp1,
      99);
      XERCES_CPP_NAMESPACE::DOMElement *q = Doc->createElement(tmp1);
      XERCES_CPP_NAMESPACE::XMLString::transcode("Comment", tmp1,
      99);
      if(Qdlg->IsCommentEnabled())

      { XERCES_CPP_NAMESPACE::XMLString::transcode("TRUE", tmp2, 99); }

      else

      { XERCES_CPP_NAMESPACE::XMLString::transcode("FALSE", tmp2, 99); }

      q->setAttribute(tmp1, tmp2);
      root->appendChild(q); // SEGFAULT HERE <-----------------------

      // when I whant to append child <------

      // and that it is an open file which <-

      // have been parse in the else <-------

      // the end don't seem to be a prob

      // set question data
      XERCES_CPP_NAMESPACE::XMLString::transcode("QData", tmp1, 99);
      XERCES_CPP_NAMESPACE::DOMElement *qd = Doc->createElement
      (tmp1);
      XERCES_CPP_NAMESPACE::XMLString::transcode(static_cast<const
      char *>(Qdlg->GetQuestion()), tmp1, 99);
      XERCES_CPP_NAMESPACE::DOMText *qdt = Doc->createTextNode(tmp1);
      q->appendChild(qd);
      qd->appendChild(qdt);
      // set question answers
      int n = Qdlg->GetAnswersCount();
      if(static_cast<bool>)
      {
      XERCES_CPP_NAMESPACE::DOMCDATASection *a;
      for(int i=0U; i<n; ++i)

      { XERCES_CPP_NAMESPACE::XMLString::transcode ("Answer", tmp1, 99); XERCES_CPP_NAMESPACE::DOMElement *a = Doc- >createElement(tmp1); XERCES_CPP_NAMESPACE::XMLString::transcode (static_cast<const char *>(Qdlg->GetAnswersString(i)), tmp1, 99); XERCES_CPP_NAMESPACE::DOMText *at = Doc- >createTextNode(tmp1); q->appendChild(a); a->appendChild(at); }

      }else

      { XERCES_CPP_NAMESPACE::XMLString::transcode("Comment", tmp1, 99); XERCES_CPP_NAMESPACE::XMLString::transcode("TRUE", tmp2, 99); q->setAttribute(tmp1, tmp2); }

      }
      Qdlg->Destroy();
      }

      The following problem is:
      If I create a new file it's OK (the if of the constructor is used).
      If I parse a file (then the else of the constructor is used) and whant to edit
      after I get a segment fault (and crash at the indicate point in the code).

      Attachments

        Activity

          People

            Unassigned Unassigned
            aaulagnier@yahoo.fr Adrien AULAGNIER
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: