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