Skip to content
Snippets Groups Projects
Commit 2d69f18d authored by Gareth Reakes's avatar Gareth Reakes
Browse files

Fixed bugzilla bug 23100. Thanks to Joanne Bogart.

git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@175956 13f79535-47bb-0310-9956-ffa450edef68
parent 2f0bfcb2
No related branches found
No related tags found
No related merge requests found
...@@ -654,6 +654,8 @@ void AbstractDOMParser::docPI( const XMLCh* const target ...@@ -654,6 +654,8 @@ void AbstractDOMParser::docPI( const XMLCh* const target
void AbstractDOMParser::endEntityReference(const XMLEntityDecl&) void AbstractDOMParser::endEntityReference(const XMLEntityDecl&)
{ {
if (!fCreateEntityReferenceNodes) return;
DOMEntityReferenceImpl *erImpl = 0; DOMEntityReferenceImpl *erImpl = 0;
DOMNode* firstChild = 0; DOMNode* firstChild = 0;
...@@ -664,69 +666,7 @@ void AbstractDOMParser::endEntityReference(const XMLEntityDecl&) ...@@ -664,69 +666,7 @@ void AbstractDOMParser::endEntityReference(const XMLEntityDecl&)
fCurrentParent = fNodeStack->pop(); fCurrentParent = fNodeStack->pop();
if (!fCreateEntityReferenceNodes && erImpl && firstChild) { fCurrentNode = fCurrentParent;
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);
if (erImpl->getBaseURI()) {
/**
* Record baseURI information for the Element (by adding xml:base attribute)
* or for the ProcessingInstruction (by setting a baseURI field)
*/
if (fCurrentNode->getNodeType() == DOMNode::ELEMENT_NODE) {
// if an element already has xml:base attribute
// do nothing
const XMLCh baseString[] =
{
chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull
};
const XMLCh xmlBaseString[] =
{
chLatin_x, chLatin_m, chLatin_l, chColon, chLatin_b, chLatin_a, chLatin_s, chLatin_e, chNull
};
if (fScanner -> getDoNamespaces() && (((DOMElement*)fCurrentNode)->getAttributeNodeNS(DOMNodeImpl::getXmlURIString(), baseString) != 0)) {
return;
} else if (((DOMElement*)fCurrentNode)->getAttributeNode(xmlBaseString) != 0) {
return;
}
// retrive the baseURI from the entity decl
const XMLCh* baseURI = erImpl->getBaseURI();
if (baseURI != 0 && !XMLString::equals(baseURI,fDocument->getDocumentURI())) {
if (fScanner -> getDoNamespaces()) {
((DOMElement*)fCurrentNode)->setAttributeNS(DOMNodeImpl::getXmlURIString(), baseString, baseURI);
} else {
((DOMElement*)fCurrentNode)->setAttribute(xmlBaseString, baseURI);
}
}
}
else if (fCurrentNode->getNodeType() == DOMNode::PROCESSING_INSTRUCTION_NODE) {
((DOMProcessingInstructionImpl*)fCurrentNode)->setBaseURI(erImpl->getBaseURI());
}
}
}
next = kid->getNextSibling();
}
}
else
fCurrentNode = fCurrentParent;
if (erImpl) if (erImpl)
erImpl->setReadOnly(true, true); erImpl->setReadOnly(true, true);
...@@ -1039,27 +979,30 @@ void AbstractDOMParser::startEntityReference(const XMLEntityDecl& entDecl) ...@@ -1039,27 +979,30 @@ void AbstractDOMParser::startEntityReference(const XMLEntityDecl& entDecl)
entity->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr()); entity->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr());
fCurrentEntity = entity; fCurrentEntity = entity;
DOMEntityReference *er = fDocument->createEntityReferenceByParser(entName);
//set the readOnly flag to false before appending node, will be reset in endEntityReference // Following line has been moved up so that erImpl is only declared
DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er; // and used if create entity ref flag is true
erImpl->setReadOnly(false, true); if (fCreateEntityReferenceNodes == true) {
DOMEntityReference *er = fDocument->createEntityReferenceByParser(entName);
//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); fCurrentParent->appendChild(er);
}
fNodeStack->push(fCurrentParent); fNodeStack->push(fCurrentParent);
fCurrentParent = er; fCurrentParent = er;
fCurrentNode = er; fCurrentNode = er;
// this entityRef needs to be stored in Entity map too. // this entityRef needs to be stored in Entity map too.
// We'd decide later whether the entity nodes should be created by a // 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 // separated method in parser or not. For now just stick it in if
// the ref nodes are created // the ref nodes are created
if (entity) if (entity)
entity->setEntityRef(er); entity->setEntityRef(er);
}
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment