diff --git a/src/xercesc/dom/deprecated/DOMParser.cpp b/src/xercesc/dom/deprecated/DOMParser.cpp index 705f433ef051c0d68625b6224ccda1b5025fbc9d..c1c62eab1b9783e6105d9bc4a757686503f0880f 100644 --- a/src/xercesc/dom/deprecated/DOMParser.cpp +++ b/src/xercesc/dom/deprecated/DOMParser.cpp @@ -546,9 +546,10 @@ void DOMParser::endEntityReference(const XMLEntityDecl& entDecl) } -void DOMParser::endElement( const XMLElementDecl& elemDecl +void DOMParser::endElement( const XMLElementDecl& elemDecl , const unsigned int urlId - , const bool isRoot) + , const bool isRoot + , const XMLCh* const elemPrefix) { fCurrentNode = fCurrentParent; fCurrentParent = fNodeStack->pop(); @@ -626,11 +627,19 @@ void DOMParser::startElement(const XMLElementDecl& elemDecl if (fScanner -> getDoNamespaces()) { //DOM Level 2, doNamespaces on XMLBuffer buf; DOMString namespaceURI = 0; + DOMString elemQName = 0; if (urlId != fScanner->getEmptyNamespaceId()) { //TagName has a prefix fScanner->getURIText(urlId, buf); //get namespaceURI namespaceURI = DOMString(buf.getRawBuffer()); + + if (elemPrefix && *elemPrefix) { + elemQName.appendData(elemPrefix); + elemQName.appendData(chColon); + } } - elem = fDocument.createElementNS(namespaceURI, elemDecl.getFullName()); + elemQName.appendData(elemDecl.getBaseName()); + + elem = fDocument.createElementNS(namespaceURI, elemQName); ElementImpl *elemImpl = (ElementImpl *) elem.fImpl; for (unsigned int index = 0; index < attrCount; ++index) { static const XMLCh XMLNS[] = { @@ -692,7 +701,7 @@ void DOMParser::startElement(const XMLElementDecl& elemDecl // If an empty element, do end right now (no endElement() will be called) if (isEmpty) - endElement(elemDecl, urlId, isRoot); + endElement(elemDecl, urlId, isRoot, elemPrefix); } diff --git a/src/xercesc/dom/deprecated/DOMParser.hpp b/src/xercesc/dom/deprecated/DOMParser.hpp index 06f7c2605fa9d0f150d2b000655309c55fbfa815..d849a4cc8da03e7f76293f4258c4887bd6e31f03 100644 --- a/src/xercesc/dom/deprecated/DOMParser.hpp +++ b/src/xercesc/dom/deprecated/DOMParser.hpp @@ -1092,12 +1092,16 @@ public : * namespaces setting is switched on. * @param isRoot A flag indicating whether this element was the * root element. + * @param elemPrefix A const pointer to a Unicode string containing + * the namespace prefix for this element. Applicable + * only when namespace processing is enabled. */ virtual void endElement ( const XMLElementDecl& elemDecl , const unsigned int urlId , const bool isRoot + , const XMLCh* const elemPrefix=0 ); /** Handle and end of entity reference event diff --git a/src/xercesc/framework/XMLDocumentHandler.hpp b/src/xercesc/framework/XMLDocumentHandler.hpp index 8295d6e04c6e46e47c10e08df456e01bf678bcfc..9bcdda71fef7e496ca94dd6cf7673a70a352c136 100644 --- a/src/xercesc/framework/XMLDocumentHandler.hpp +++ b/src/xercesc/framework/XMLDocumentHandler.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.3 2002/05/28 20:41:11 tng + * [Bug 9104] prefixes dissapearing when schema validation turned on. + * * Revision 1.2 2002/02/20 18:17:01 tng * [Bug 5977] Warnings on generating apiDocs. * @@ -202,12 +205,14 @@ public: * @param uriId The ID of the URI in the URI pool (only valid if * name spaces is enabled) * @param isRoot Indicates if this is the root element. + * @param prefixName The string representing the prefix name */ virtual void endElement ( const XMLElementDecl& elemDecl , const unsigned int uriId , const bool isRoot + , const XMLCh* const prefixName = 0 ) = 0; /** Receive notification when a referenced entity's content ends diff --git a/src/xercesc/internal/XMLScanner.cpp b/src/xercesc/internal/XMLScanner.cpp index a387ebcbf65d9e2693f7c0c815d12777de205849..3b0ebbd3baf62f7903fa44b7185143658144aa04 100644 --- a/src/xercesc/internal/XMLScanner.cpp +++ b/src/xercesc/internal/XMLScanner.cpp @@ -1708,9 +1708,9 @@ void XMLScanner::scanEndTag(bool& gotData) unsigned int uriId = fEmptyNamespaceId; XMLBufBid bbName(&fBufMgr); + XMLBufBid bbPrefix(&fBufMgr); if (fDoNamespaces) { - XMLBufBid bbPrefix(&fBufMgr); uriId = resolveQName ( qnameBuf.getRawBuffer() @@ -1893,6 +1893,7 @@ void XMLScanner::scanEndTag(bool& gotData) *topElem->fThisElement , uriId , isRoot + , bbPrefix.getRawBuffer() ); } @@ -3488,6 +3489,7 @@ bool XMLScanner::scanStartTagNS(bool& gotData) *elemDecl , uriId , isRoot + , fPrefixBuf.getRawBuffer() ); } diff --git a/src/xercesc/parsers/AbstractDOMParser.cpp b/src/xercesc/parsers/AbstractDOMParser.cpp index ba61e242b02572e3fd0a2d2bd77283b0a9c479b6..5d2c65b84d023621eaae60eed8976a333370303c 100644 --- a/src/xercesc/parsers/AbstractDOMParser.cpp +++ b/src/xercesc/parsers/AbstractDOMParser.cpp @@ -505,7 +505,8 @@ void AbstractDOMParser::endEntityReference(const XMLEntityDecl& entDecl) void AbstractDOMParser::endElement( const XMLElementDecl& elemDecl , const unsigned int urlId - , const bool isRoot) + , const bool isRoot + , const XMLCh* const elemPrefix) { fCurrentNode = fCurrentParent; fCurrentParent = fNodeStack->pop(); @@ -587,14 +588,24 @@ void AbstractDOMParser::startElement(const XMLElementDecl& elemDecl if (fScanner -> getDoNamespaces()) { //DOM Level 2, doNamespaces on - XMLBufBid bbQName(&fBufMgr); - XMLBuffer& buf = bbQName.getBuffer(); + XMLBufBid bbURI(&fBufMgr); + XMLBuffer& bufURI = bbURI.getBuffer(); XMLCh* namespaceURI = 0; + + XMLBufBid elemQName(&fBufMgr); + if (urlId != fScanner->getEmptyNamespaceId()) { //TagName has a prefix - fScanner->getURIText(urlId, buf); //get namespaceURI - namespaceURI = buf.getRawBuffer(); + fScanner->getURIText(urlId, bufURI); //get namespaceURI + namespaceURI = bufURI.getRawBuffer(); + + if (elemPrefix && *elemPrefix) { + elemQName.set(elemPrefix); + elemQName.append(chColon); + } } - elem = createElementNSNode(namespaceURI, elemDecl.getFullName()); + elemQName.append(elemDecl.getBaseName()); + + elem = createElementNSNode(namespaceURI, elemQName.getRawBuffer()); DOMElementImpl *elemImpl = (DOMElementImpl *) elem; for (unsigned int index = 0; index < attrCount; ++index) { static const XMLCh XMLNS[] = { @@ -606,8 +617,8 @@ void AbstractDOMParser::startElement(const XMLElementDecl& elemDecl if (!XMLString::compareString(oneAttrib -> getName(), XMLNS)) //for xmlns=... attrURIId = fScanner->getXMLNSNamespaceId(); if (attrURIId != fScanner->getEmptyNamespaceId()) { //TagName has a prefix - fScanner->getURIText(attrURIId, buf); //get namespaceURI - namespaceURI = buf.getRawBuffer(); + fScanner->getURIText(attrURIId, bufURI); //get namespaceURI + namespaceURI = bufURI.getRawBuffer(); } // revisit. Optimize to init the named node map to the // right size up front. @@ -667,7 +678,7 @@ void AbstractDOMParser::startElement(const XMLElementDecl& elemDecl // If an empty element, do end right now (no endElement() will be called) if (isEmpty) - endElement(elemDecl, urlId, isRoot); + endElement(elemDecl, urlId, isRoot, elemPrefix); } diff --git a/src/xercesc/parsers/AbstractDOMParser.hpp b/src/xercesc/parsers/AbstractDOMParser.hpp index 83cb88ceaae7bf9f25759cd91e51383f7c6d26c2..60792b7cdc24d0076be6ed5db9cc6f4db727a315 100644 --- a/src/xercesc/parsers/AbstractDOMParser.hpp +++ b/src/xercesc/parsers/AbstractDOMParser.hpp @@ -885,12 +885,16 @@ public : * namespaces setting is switched on. * @param isRoot A flag indicating whether this element was the * root element. + * @param elemPrefix A const pointer to a Unicode string containing + * the namespace prefix for this element. Applicable + * only when namespace processing is enabled. */ virtual void endElement ( const XMLElementDecl& elemDecl , const unsigned int urlId , const bool isRoot + , const XMLCh* const elemPrefix ); /** Handle and end of entity reference event diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp index adcb8e215f2b45404b4bda3c37ce7f5f3cea886b..68de9b22a6deaa3bf14bf1348d3e3651c007cb92 100644 --- a/src/xercesc/parsers/SAX2XMLReaderImpl.cpp +++ b/src/xercesc/parsers/SAX2XMLReaderImpl.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.5 2002/05/28 20:44:14 tng + * [Bug 9104] prefixes dissapearing when schema validation turned on. + * * Revision 1.4 2002/05/27 18:39:21 tng * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number. * @@ -772,116 +775,116 @@ startElement( const XMLElementDecl& elemDecl , const bool isEmpty , const bool isRoot) { - - // Bump the element depth counter if not empty + // Bump the element depth counter if not empty if (!isEmpty) fElemDepth++; if (fDocHandler) - { - - if (getDoNamespaces()) - { + { + XMLBufBid elemQName( &fStringBuffers ) ; + if (elemPrefix && *elemPrefix) { + elemQName.set(elemPrefix); + elemQName.append(chColon); + } + elemQName.append(elemDecl.getBaseName()); + + if (getDoNamespaces()) + { unsigned int numPrefix = 0; - const XMLCh* nsString = XMLUni::fgXMLNSString; - const XMLCh* nsPrefix = 0; - const XMLCh* nsURI = 0; - const XMLAttr* tempAttr = 0; + const XMLCh* nsString = XMLUni::fgXMLNSString; + const XMLCh* nsPrefix = 0; + const XMLCh* nsURI = 0; + const XMLAttr* tempAttr = 0; if (!fnamespacePrefix) - { + { tempAttrVec->removeAllElements(); - } - - for (unsigned int i = 0; i < attrCount; i++) - { - tempAttr = attrList.elementAt(i); - if (XMLString::compareString(tempAttr->getQName(), nsString) == 0) - nsURI = tempAttr->getValue(); - if (XMLString::compareString(tempAttr->getPrefix(), nsString) == 0) - { - nsPrefix = tempAttr->getName(); - nsURI = tempAttr->getValue(); - } - if (!fnamespacePrefix) - { - if (nsURI == 0) - tempAttrVec->addElement((XMLAttr* const)tempAttr); - } - if (nsURI != 0) - { - if (nsPrefix == 0) - nsPrefix = XMLUni::fgZeroLenString; - fDocHandler->startPrefixMapping(nsPrefix, nsURI); - - XMLBuffer &buf = fStringBuffers.bidOnBuffer() ; - buf.set ( nsPrefix ) ; - fPrefixes->push(&buf) ; - - numPrefix++; - } - nsURI = 0; - nsPrefix = 0; - } - prefixCounts->push(numPrefix) ; - if (!fnamespacePrefix) - fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner); - else + } + + for (unsigned int i = 0; i < attrCount; i++) + { + tempAttr = attrList.elementAt(i); + if (XMLString::compareString(tempAttr->getQName(), nsString) == 0) + nsURI = tempAttr->getValue(); + if (XMLString::compareString(tempAttr->getPrefix(), nsString) == 0) + { + nsPrefix = tempAttr->getName(); + nsURI = tempAttr->getValue(); + } + if (!fnamespacePrefix) + { + if (nsURI == 0) + tempAttrVec->addElement((XMLAttr* const)tempAttr); + } + if (nsURI != 0) + { + if (nsPrefix == 0) + nsPrefix = XMLUni::fgZeroLenString; + fDocHandler->startPrefixMapping(nsPrefix, nsURI); + XMLBuffer &buf = fStringBuffers.bidOnBuffer(); + buf.set ( nsPrefix ) ; + fPrefixes->push(&buf) ; + numPrefix++; + } + nsURI = 0; + nsPrefix = 0; + } + prefixCounts->push(numPrefix) ; + if (!fnamespacePrefix) + fAttrList.setVector(tempAttrVec, tempAttrVec->size(), fScanner); + else fAttrList.setVector(&attrList, attrCount, fScanner); - // call startElement() with namespace declarations - XMLBufBid URIBufferBid ( &fStringBuffers ) ; - XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ; + // call startElement() with namespace declarations + XMLBufBid URIBufferBid ( &fStringBuffers ) ; + XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ; - fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer); - - fDocHandler->startElement(URIBuffer.getRawBuffer(), + fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer); + + fDocHandler->startElement(URIBuffer.getRawBuffer(), elemDecl.getBaseName(), - elemDecl.getFullName(), + elemQName.getRawBuffer(), fAttrList); - } - else - { - fAttrList.setVector(&attrList, attrCount, fScanner); - fDocHandler->startElement(XMLUni::fgZeroLenString, + } + else // no namespace + { + fAttrList.setVector(&attrList, attrCount, fScanner); + fDocHandler->startElement(XMLUni::fgZeroLenString, elemDecl.getBaseName(), elemDecl.getFullName(), fAttrList); - } + } // If its empty, send the end tag event now if (isEmpty) - { - - // call endPrefixMapping appropriately. - if (getDoNamespaces()) - { - XMLBufBid URIBufferBid ( &fStringBuffers ) ; - XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ; + { + // call endPrefixMapping appropriately. + if (getDoNamespaces()) + { + XMLBufBid URIBufferBid ( &fStringBuffers ) ; + XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ; + fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer); - fScanner->getURIText(elemURLId, (XMLBuffer &)URIBuffer); - - fDocHandler->endElement( URIBuffer.getRawBuffer(), + fDocHandler->endElement( URIBuffer.getRawBuffer(), elemDecl.getBaseName(), - elemDecl.getFullName() ); - unsigned int numPrefix = prefixCounts->pop(); - for (unsigned int i = 0; i < numPrefix; ++i) - { - XMLBuffer * buf = fPrefixes->pop() ; - fDocHandler->endPrefixMapping( buf->getRawBuffer() ); - fStringBuffers.releaseBuffer(*buf) ; - } - } - else - { - fDocHandler->endElement(XMLUni::fgZeroLenString, - elemDecl.getBaseName(), - elemDecl.getFullName() ); - - } - - } + elemQName.getRawBuffer()); + + unsigned int numPrefix = prefixCounts->pop(); + for (unsigned int i = 0; i < numPrefix; ++i) + { + XMLBuffer * buf = fPrefixes->pop() ; + fDocHandler->endPrefixMapping( buf->getRawBuffer() ); + fStringBuffers.releaseBuffer(*buf) ; + } + } + else + { + fDocHandler->endElement(XMLUni::fgZeroLenString, + elemDecl.getBaseName(), + elemDecl.getFullName()); + } + } } // @@ -905,46 +908,54 @@ startElement( const XMLElementDecl& elemDecl void SAX2XMLReaderImpl::endElement( const XMLElementDecl& elemDecl , const unsigned int uriId - , const bool isRoot) + , const bool isRoot + , const XMLCh* const elemPrefix) { // Just map to the SAX document handler if (fDocHandler) - { + { - // get the prefixes back so that we can call endPrefixMapping() + // get the prefixes back so that we can call endPrefixMapping() if (getDoNamespaces()) - { - XMLBufBid URIBufferBid ( &fStringBuffers ) ; - XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ; + { + XMLBufBid URIBufferBid ( &fStringBuffers ) ; + XMLBuffer &URIBuffer = URIBufferBid.getBuffer() ; - fScanner->getURIText(uriId, URIBuffer ) ; - fDocHandler->endElement( URIBuffer.getRawBuffer(), - elemDecl.getBaseName(), - elemDecl.getFullName() ); - - unsigned int numPrefix = prefixCounts->pop(); - for (unsigned int i = 0; i < numPrefix; i++) - { - XMLBuffer * buf = fPrefixes->pop() ; - fDocHandler->endPrefixMapping( buf->getRawBuffer() ); - fStringBuffers.releaseBuffer(*buf) ; - } - } - else - { - fDocHandler->endElement(XMLUni::fgZeroLenString, + fScanner->getURIText(uriId, URIBuffer ) ; + + XMLBufBid elemQName( &fStringBuffers ) ; + if (elemPrefix && *elemPrefix) { + elemQName.set(elemPrefix); + elemQName.append(chColon); + } + elemQName.append(elemDecl.getBaseName()); + + fDocHandler->endElement( URIBuffer.getRawBuffer(), elemDecl.getBaseName(), - elemDecl.getFullName() ); - } - - } + elemQName.getRawBuffer()); + + unsigned int numPrefix = prefixCounts->pop(); + for (unsigned int i = 0; i < numPrefix; i++) + { + XMLBuffer * buf = fPrefixes->pop() ; + fDocHandler->endPrefixMapping( buf->getRawBuffer() ); + fStringBuffers.releaseBuffer(*buf) ; + } + } + else + { + fDocHandler->endElement(XMLUni::fgZeroLenString, + elemDecl.getBaseName(), + elemDecl.getFullName() ); + } + } // // If there are any installed advanced handlers, then lets call them // with this info. // for (unsigned int index = 0; index < fAdvDHCount; index++) - fAdvDHList[index]->endElement(elemDecl, uriId, isRoot); + fAdvDHList[index]->endElement(elemDecl, uriId, isRoot, elemPrefix); // // Dump the element depth down again. Don't let it underflow in case diff --git a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp index 15158ec9b845732806d7fb50c0ab24cf639615ee..c78d7c9066deec0fb6c7da3b9e0af5c3cf8a5533 100644 --- a/src/xercesc/parsers/SAX2XMLReaderImpl.hpp +++ b/src/xercesc/parsers/SAX2XMLReaderImpl.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2002/05/28 20:44:14 tng + * [Bug 9104] prefixes dissapearing when schema validation turned on. + * * Revision 1.3 2002/05/27 18:39:21 tng * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number. * @@ -283,6 +286,9 @@ public : * namespaces setting is switched on. * @param isRoot A flag indicating whether this element was the * root element. + * @param elemPrefix A const pointer to a Unicode string containing + * the namespace prefix for this element. Applicable + * only when namespace processing is enabled. * @see DocumentHandler#endElement */ virtual void endElement @@ -290,6 +296,7 @@ public : const XMLElementDecl& elemDecl , const unsigned int urlId , const bool isRoot + , const XMLCh* const elemPrefix=0 ); /** diff --git a/src/xercesc/parsers/SAXParser.cpp b/src/xercesc/parsers/SAXParser.cpp index 1536840bcef276dddcabf3fe9f0a12bda891b0db..ae450a63b55ab45c0ceef4d5a409579328c3b5a4 100644 --- a/src/xercesc/parsers/SAXParser.cpp +++ b/src/xercesc/parsers/SAXParser.cpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2002/05/28 20:44:14 tng + * [Bug 9104] prefixes dissapearing when schema validation turned on. + * * Revision 1.3 2002/05/27 18:39:21 tng * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number. * @@ -692,18 +695,31 @@ void SAXParser::endDocument() void SAXParser::endElement( const XMLElementDecl& elemDecl , const unsigned int uriId - , const bool isRoot) + , const bool isRoot + , const XMLCh* const elemPrefix) { // Just map to the SAX document handler - if (fDocHandler) - fDocHandler->endElement(elemDecl.getFullName()); + if (fDocHandler) { + if (fScanner->getDoNamespaces()) { + XMLBuffer elemQName; + if (elemPrefix && *elemPrefix) { + elemQName.set(elemPrefix); + elemQName.append(chColon); + } + elemQName.append(elemDecl.getBaseName()); + fDocHandler->endElement(elemQName.getRawBuffer()); + } + else + fDocHandler->endElement(elemDecl.getFullName()); + + } // // If there are any installed advanced handlers, then lets call them // with this info. // for (unsigned int index = 0; index < fAdvDHCount; index++) - fAdvDHList[index]->endElement(elemDecl, uriId, isRoot); + fAdvDHList[index]->endElement(elemDecl, uriId, isRoot, elemPrefix); // // Dump the element depth down again. Don't let it underflow in case @@ -798,11 +814,27 @@ startElement( const XMLElementDecl& elemDecl if (fDocHandler) { fAttrList.setVector(&attrList, attrCount); - fDocHandler->startElement(elemDecl.getFullName(), fAttrList); + if (fScanner->getDoNamespaces()) { + XMLBuffer elemQName; + if (elemPrefix && *elemPrefix) { + elemQName.set(elemPrefix); + elemQName.append(chColon); + } + elemQName.append(elemDecl.getBaseName()); - // If its empty, send the end tag event now - if (isEmpty) - fDocHandler->endElement(elemDecl.getFullName()); + fDocHandler->startElement(elemQName.getRawBuffer(), fAttrList); + + // If its empty, send the end tag event now + if (isEmpty) + fDocHandler->endElement(elemQName.getRawBuffer()); + } + else { + fDocHandler->startElement(elemDecl.getFullName(), fAttrList); + + // If its empty, send the end tag event now + if (isEmpty) + fDocHandler->endElement(elemDecl.getFullName()); + } } // diff --git a/src/xercesc/parsers/SAXParser.hpp b/src/xercesc/parsers/SAXParser.hpp index ed6ab733c6300bf07eb689597c4cb29b5b69efa5..205f9a7b01508df665553fe2525db4ce3f15e79b 100644 --- a/src/xercesc/parsers/SAXParser.hpp +++ b/src/xercesc/parsers/SAXParser.hpp @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.4 2002/05/28 20:44:14 tng + * [Bug 9104] prefixes dissapearing when schema validation turned on. + * * Revision 1.3 2002/05/27 18:39:21 tng * To get ready for 64 bit large file, use XMLSSize_t to represent line and column number. * @@ -1216,6 +1219,9 @@ public : * namespaces setting is switched on. * @param isRoot A flag indicating whether this element was the * root element. + * @param elemPrefix A const pointer to a Unicode string containing + * the namespace prefix for this element. Applicable + * only when namespace processing is enabled. * @see DocumentHandler#endElement */ virtual void endElement @@ -1223,6 +1229,7 @@ public : const XMLElementDecl& elemDecl , const unsigned int urlId , const bool isRoot + , const XMLCh* const elemPrefix ); /**