tng 2002/09/17 06:26:35 Modified: c/src/xercesc/parsers AbstractDOMParser.cpp Log: DOM Fix: store entity reference information in DocumentType entities list even setCreateEntityReference is set to false Revision Changes Path 1.23 +54 -24 xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp Index: AbstractDOMParser.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/parsers/AbstractDOMParser.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- AbstractDOMParser.cpp 5 Sep 2002 14:35:31 -0000 1.22 +++ AbstractDOMParser.cpp 17 Sep 2002 13:26:35 -0000 1.23 @@ -514,15 +514,44 @@ void AbstractDOMParser::endEntityReference(const XMLEntityDecl& entDecl) { - if (fCreateEntityReferenceNodes == true) - { - if (fCurrentParent->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) { - DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) fCurrentParent; - erImpl->setReadOnly(true, true); + DOMEntityReferenceImpl *erImpl = 0; + DOMNode* firstChild = 0; + + if (fCurrentParent->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) { + erImpl = (DOMEntityReferenceImpl *) fCurrentParent; + firstChild = erImpl->getFirstChild(); + } + + fCurrentParent = fNodeStack->pop(); + + if (!fCreateEntityReferenceNodes && erImpl && firstChild) { + DOMNode *kid, *next; + fCurrentNode = fCurrentParent->getLastChild(); + + for (kid = firstChild; kid != 0; kid = next) + { + // If kid and fCurrentNode are both Text nodes (but _not_ CDATASection, + // which is a subclass of Text), they can be merged. + if (kid->getNodeType() == DOMNode::TEXT_NODE && + fCurrentNode && + fCurrentNode->getNodeType() == DOMNode::TEXT_NODE ) + { + ((DOMTextImpl *) fCurrentNode)->appendData(((DOMTextImpl *) kid)->getData()); + } + else { + // append the child of erImpl to currentParent + fCurrentNode = kid->cloneNode(true); + fCurrentParent->appendChild(fCurrentNode); + } + + next = kid->getNextSibling(); } - fCurrentParent = fNodeStack->pop(); - fCurrentNode = fCurrentParent; } + else + fCurrentNode = fCurrentParent; + + if (erImpl) + erImpl->setReadOnly(true, true); } @@ -789,26 +818,27 @@ entity->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr()); fCurrentEntity = entity; - if (fCreateEntityReferenceNodes == true) - { - DOMEntityReference *er = fDocument->createEntityReference(entName); + DOMEntityReference *er = fDocument->createEntityReference(entName); - //set the readOnly flag to false before appending node, will be reset in endEntityReference - DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er; - erImpl->setReadOnly(false, true); + //set the readOnly flag to false before appending node, will be reset in endEntityReference + DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er; + erImpl->setReadOnly(false, true); + if (fCreateEntityReferenceNodes == true) + { fCurrentParent->appendChild(er); - fNodeStack->push(fCurrentParent); - fCurrentParent = er; - fCurrentNode = er; - - // this entityRef needs to be stored in Entity map too. - // We'd decide later whether the entity nodes should be created by a - // separated method in parser or not. For now just stick it in if - // the ref nodes are created - if (entity) - entity->setEntityRef(er); } + + fNodeStack->push(fCurrentParent); + fCurrentParent = er; + fCurrentNode = er; + + // this entityRef needs to be stored in Entity map too. + // We'd decide later whether the entity nodes should be created by a + // separated method in parser or not. For now just stick it in if + // the ref nodes are created + if (entity) + entity->setEntityRef(er); }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]