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]