diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.cpp b/src/xercesc/dom/impl/DOMDocumentImpl.cpp index aa9c7f20ff1548d84381190d00867b94b991ee56..3d6adb5ef2f8068cfa10eec329587f160e920b7e 100644 --- a/src/xercesc/dom/impl/DOMDocumentImpl.cpp +++ b/src/xercesc/dom/impl/DOMDocumentImpl.cpp @@ -362,7 +362,14 @@ DOMEntityReference *DOMDocumentImpl::createEntityReference(const XMLCh *nam) return new (this, DOMDocumentImpl::ENTITY_REFERENCE_OBJECT) DOMEntityReferenceImpl(this, nam); }; +DOMEntityReference *DOMDocumentImpl::createEntityReferenceByParser(const XMLCh *nam) +{ + if (!nam || !isXMLName(nam)) + throw DOMException( + DOMException::INVALID_CHARACTER_ERR, 0); + return new (this, DOMDocumentImpl::ENTITY_REFERENCE_OBJECT) DOMEntityReferenceImpl(this, nam, false); +}; DOMNotation *DOMDocumentImpl::createNotation(const XMLCh *nam) { diff --git a/src/xercesc/dom/impl/DOMDocumentImpl.hpp b/src/xercesc/dom/impl/DOMDocumentImpl.hpp index f813d288985e145d0f30625e259258d6486796c7..ecdcc11c83360984b5bfe58be822a7f39909a03f 100644 --- a/src/xercesc/dom/impl/DOMDocumentImpl.hpp +++ b/src/xercesc/dom/impl/DOMDocumentImpl.hpp @@ -197,6 +197,10 @@ public: virtual void removeNodeIterator(DOMNodeIteratorImpl* nodeIterator); //non-standard api + // Extension to be called by the Parser + DOMEntityReference* createEntityReferenceByParser(const XMLCh * name); + + // // Functions to keep track of document mutations, so that node list chached // information can be invalidated. One global changes counter per document. diff --git a/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp b/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp index ad60caf5867edfc08b31ffa6dfeb431ac24d2570..0b626f520b07ce84d05ea83f7cef1ef2e97d4344 100644 --- a/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp +++ b/src/xercesc/dom/impl/DOMEntityReferenceImpl.cpp @@ -98,6 +98,35 @@ DOMEntityReferenceImpl::DOMEntityReferenceImpl(DOMDocument *ownerDoc, } +DOMEntityReferenceImpl::DOMEntityReferenceImpl(DOMDocument *ownerDoc, + const XMLCh *entityName, + bool cloneChild) + : fNode(ownerDoc), fParent(ownerDoc), fBaseURI(0) +{ + fName = ((DOMDocumentImpl *)getOwnerDocument())->getPooledString(entityName); + // EntityReference behaves as a read-only node, since its contents + // reflect the Entity it refers to -- but see setNodeName(). + //retrieve the corresponding entity content + + if (ownerDoc) { + if (ownerDoc->getDoctype()) { + if (ownerDoc->getDoctype()->getEntities()) { + DOMEntityImpl* entity = (DOMEntityImpl*)ownerDoc->getDoctype()->getEntities()->getNamedItem(entityName); + if (entity) { + fBaseURI = entity->getBaseURI(); + if (cloneChild) { + DOMEntityReference* refEntity = entity->getEntityRef(); + if (refEntity) { + fParent.cloneChildren(refEntity); + } + } + } + } + } + } + + fNode.setReadOnly(true, true); +} DOMEntityReferenceImpl::DOMEntityReferenceImpl(const DOMEntityReferenceImpl &other, bool deep) diff --git a/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp b/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp index 3c54dc28f15661f5a3c8e69f35b4ecffffeba4c3..a2100e2b05ae55032a9b108a03a3bab1a201ac2b 100644 --- a/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp +++ b/src/xercesc/dom/impl/DOMEntityReferenceImpl.hpp @@ -94,6 +94,7 @@ private: public: DOMEntityReferenceImpl(DOMDocument *ownerDoc, const XMLCh *entityName); + DOMEntityReferenceImpl(DOMDocument *ownerDoc, const XMLCh *entityName, bool cloneChild); DOMEntityReferenceImpl(const DOMEntityReferenceImpl &other, bool deep=false); virtual ~DOMEntityReferenceImpl(); diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp index bc7f9a83823b25b4a3aee190397f6e0b22f66c82..0bcc9c586706bbdd612eaffaeed8d964b53555f5 100644 --- a/src/xercesc/parsers/AbstractDOMParser.cpp +++ b/src/xercesc/parsers/AbstractDOMParser.cpp @@ -1015,7 +1015,7 @@ void AbstractDOMParser::startEntityReference(const XMLEntityDecl& entDecl) entity->setActualEncoding(fScanner->getReaderMgr()->getCurrentEncodingStr()); fCurrentEntity = entity; - DOMEntityReference *er = fDocument->createEntityReference(entName); + DOMEntityReference *er = fDocument->createEntityReferenceByParser(entName); //set the readOnly flag to false before appending node, will be reset in endEntityReference DOMEntityReferenceImpl *erImpl = (DOMEntityReferenceImpl *) er;