diff --git a/src/xercesc/parsers/DOMParser.cpp b/src/xercesc/parsers/DOMParser.cpp index b9b0fda613171a058342c3cc5c1d83c1bc1e7754..bbf42a45205715d372d83f313763716bda7dc02b 100644 --- a/src/xercesc/parsers/DOMParser.cpp +++ b/src/xercesc/parsers/DOMParser.cpp @@ -505,18 +505,10 @@ void DOMParser::docCharacters( const XMLCh* const chars else { DOM_Text node = fDocument.createTextNode(DOMString(chars, length)); - //If the node type is entityRef then set the readOnly flag to false before appending node - bool oldReadFlag; - if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { - oldReadFlag = fCurrentParent.fImpl->isReadOnly(); - fCurrentParent.fImpl->isReadOnly(false); - } - fCurrentParent.appendChild(node); - if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { - fCurrentParent.fImpl->isReadOnly(oldReadFlag); - } + fCurrentNode = node; + } } } @@ -547,6 +539,9 @@ void DOMParser::endEntityReference(const XMLEntityDecl& entDecl) { if (fCreateEntityReferenceNodes == true) { + if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { + ((DOM_EntityReference&)fCurrentParent).fImpl->setReadOnly(true, true); + } fCurrentParent = fNodeStack->pop(); fCurrentNode = fCurrentParent; } @@ -584,17 +579,7 @@ void DOMParser::ignorableWhitespace(const XMLCh* const chars DOM_Text node = fDocument.createTextNode(DOMString(chars, length)); TextImpl *text = (TextImpl *) node.fImpl; text -> setIgnorableWhitespace(true); - //If the node type is entityRef then set the readOnly flag to false before appending node - bool oldReadFlag; - if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { - oldReadFlag = fCurrentParent.fImpl->isReadOnly(); - fCurrentParent.fImpl->isReadOnly(false); - } - fCurrentParent.appendChild(node); - if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { - fCurrentParent.fImpl->isReadOnly(oldReadFlag); - } fCurrentNode = node; } @@ -679,39 +664,28 @@ void DOMParser::startElement(const XMLElementDecl& elemDecl attr->setSpecified(oneAttrib->getSpecified()); } } - else { //DOM Level 1 - elem = fDocument.createElement(elemDecl.getFullName()); - ElementImpl *elemImpl = (ElementImpl *) elem.fImpl; - for (unsigned int index = 0; index < attrCount; ++index) { - const XMLAttr* oneAttrib = attrList.elementAt(index); - AttrImpl *attr = elemImpl->setAttribute(oneAttrib->getName(), oneAttrib->getValue()); - attr->setSpecified(oneAttrib->getSpecified()); - - // Attributes of type ID. If this is one, add it to the hashtable of IDs - // that is constructed for use by GetElementByID(). - // - if (oneAttrib->getType()==XMLAttDef::ID) - { - if (docImpl->fNodeIDMap == 0) - docImpl->fNodeIDMap = new NodeIDMap(500); - docImpl->fNodeIDMap->add(attr); - attr->isIdAttr(true); - } - - } - } + else { //DOM Level 1 + elem = fDocument.createElement(elemDecl.getFullName()); + ElementImpl *elemImpl = (ElementImpl *) elem.fImpl; + for (unsigned int index = 0; index < attrCount; ++index) { + const XMLAttr* oneAttrib = attrList.elementAt(index); + AttrImpl *attr = elemImpl->setAttribute(oneAttrib->getName(), oneAttrib->getValue()); + attr->setSpecified(oneAttrib->getSpecified()); - //If the node type is entityRef then set the readOnly flag to false before appending node - bool oldReadFlag; - if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { - oldReadFlag = fCurrentParent.fImpl->isReadOnly(); - fCurrentParent.fImpl->isReadOnly(false); - } + // Attributes of type ID. If this is one, add it to the hashtable of IDs + // that is constructed for use by GetElementByID(). + // + if (oneAttrib->getType()==XMLAttDef::ID) + { + if (docImpl->fNodeIDMap == 0) + docImpl->fNodeIDMap = new NodeIDMap(500); + docImpl->fNodeIDMap->add(attr); + attr->isIdAttr(true); + } + } + } fCurrentParent.appendChild(elem); - if (fCurrentParent.getNodeType() == DOM_Node::ENTITY_REFERENCE_NODE) { - fCurrentParent.fImpl->isReadOnly(oldReadFlag); - } fNodeStack->push(fCurrentParent); fCurrentParent = elem; @@ -730,6 +704,10 @@ void DOMParser::startEntityReference(const XMLEntityDecl& entDecl) { DOMString entName(entDecl.getName()); DOM_EntityReference er = fDocument.createEntityReference(entName); + + //set the readOnly flag to false before appending node, will be reset in endEntityReference + er.fImpl->setReadOnly(false, true); + fCurrentParent.appendChild(er); fNodeStack->push(fCurrentParent); fCurrentParent = er; diff --git a/src/xercesc/parsers/IDOMParser.cpp b/src/xercesc/parsers/IDOMParser.cpp index 8b7c423c22f32e7a95048b070836cd1c023d2cad..cbdea74da81320267be73ef75b1d482089793b8f 100644 --- a/src/xercesc/parsers/IDOMParser.cpp +++ b/src/xercesc/parsers/IDOMParser.cpp @@ -545,18 +545,7 @@ void IDOMParser::docCharacters( const XMLCh* const chars else { IDOM_Text *node = fDocument->createTextNode(chars); - //If the node type is entityRef then set the readOnly flag to false before appending node - if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) { - IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) fCurrentParent; - bool oldReadFlag = erImpl->fNode.isReadOnly(); - erImpl->fNode.isReadOnly(false); - fCurrentParent->appendChild(node); - erImpl->fNode.isReadOnly(oldReadFlag); - } - else - { - fCurrentParent->appendChild(node); - } + fCurrentParent->appendChild(node); fCurrentNode = node; } } @@ -590,6 +579,10 @@ void IDOMParser::endEntityReference(const XMLEntityDecl& entDecl) { if (fCreateEntityReferenceNodes == true) { + if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) { + IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) fCurrentParent; + erImpl->setReadOnly(true, true); + } fCurrentParent = fNodeStack->pop(); fCurrentNode = fCurrentParent; } @@ -631,19 +624,7 @@ void IDOMParser::ignorableWhitespace(const XMLCh* const chars { IDTextImpl *node = (IDTextImpl *)fDocument->createTextNode(chars); node->setIgnorableWhitespace(true); - //If the node type is entityRef then set the readOnly flag to false before appending node - if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) { - IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) fCurrentParent; - bool oldReadFlag = erImpl->fNode.isReadOnly(); - erImpl->fNode.isReadOnly(false); - fCurrentParent->appendChild(node); - erImpl->fNode.isReadOnly(oldReadFlag); - } - - else - { - fCurrentParent->appendChild(node); - } + fCurrentParent->appendChild(node); fCurrentNode = node; } @@ -761,20 +742,7 @@ void IDOMParser::startElement(const XMLElementDecl& elemDecl } } - //If the node type is entityRef then set the readOnly flag to false before appending node - bool oldReadFlag; - if (fCurrentParent->getNodeType() == IDOM_Node::ENTITY_REFERENCE_NODE) { - IDEntityReferenceImpl *erNode = (IDEntityReferenceImpl *)fCurrentParent; - oldReadFlag = erNode->fNode.isReadOnly(); - erNode->fNode.isReadOnly(false); - fCurrentParent->appendChild(elem); - erNode->fNode.isReadOnly(oldReadFlag); - } - - else - { - fCurrentParent->appendChild(elem); - } + fCurrentParent->appendChild(elem); fNodeStack->push(fCurrentParent); fCurrentParent = elem; @@ -793,6 +761,11 @@ void IDOMParser::startEntityReference(const XMLEntityDecl& entDecl) { const XMLCh * entName = entDecl.getName(); IDOM_EntityReference *er = fDocument->createEntityReference(entName); + + //set the readOnly flag to false before appending node, will be reset in endEntityReference + IDEntityReferenceImpl *erImpl = (IDEntityReferenceImpl *) er; + erImpl->setReadOnly(false, true); + fCurrentParent->appendChild(er); fNodeStack->push(fCurrentParent); fCurrentParent = er;