Details
-
Bug
-
Status: Resolved
-
Resolution: Incomplete
-
2.3.0
-
None
-
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
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())
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)
}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).