From b42e2bc6b6599153430f7a50eca9af65b9677fb3 Mon Sep 17 00:00:00 2001 From: Tinny Ng <tng@apache.org> Date: Tue, 28 May 2002 20:44:50 +0000 Subject: [PATCH] [Bug 9104] prefixes dissapearing when schema validation turned on. git-svn-id: https://svn.apache.org/repos/asf/xerces/c/trunk@173759 13f79535-47bb-0310-9956-ffa450edef68 --- src/xercesc/dom/deprecated/DOMParser.cpp | 17 +- src/xercesc/dom/deprecated/DOMParser.hpp | 4 + src/xercesc/framework/XMLDocumentHandler.hpp | 5 + src/xercesc/internal/XMLScanner.cpp | 4 +- src/xercesc/parsers/AbstractDOMParser.cpp | 29 ++- src/xercesc/parsers/AbstractDOMParser.hpp | 4 + src/xercesc/parsers/SAX2XMLReaderImpl.cpp | 241 ++++++++++--------- src/xercesc/parsers/SAX2XMLReaderImpl.hpp | 7 + src/xercesc/parsers/SAXParser.cpp | 48 +++- src/xercesc/parsers/SAXParser.hpp | 7 + 10 files changed, 229 insertions(+), 137 deletions(-) diff --git a/src/xercesc/dom/deprecated/DOMParser.cpp b/src/xercesc/dom/deprecated/DOMParser.cpp index 705f433ef..c1c62eab1 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 06f7c2605..d849a4cc8 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 8295d6e04..9bcdda71f 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 a387ebcbf..3b0ebbd3b 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 ba61e242b..5d2c65b84 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 83cb88cea..60792b7cd 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 adcb8e215..68de9b22a 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 15158ec9b..c78d7c906 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 1536840bc..ae450a63b 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 ed6ab733c..205f9a7b0 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 ); /** -- GitLab