Hi,

I sort of understand what you are saying.

For my application, I do not think I need namespaces.  I only added them to solve the 
localName problem.  Yes, WSZ_NAMESPACE_URI is not null because, again I thought I had 
to add this to solve the localName problem.

All I am trying to do is take some rather simple XML documents, serialize them, send 
them over a socket, recreate the XML document on the other side.  I am using 
isNodeEqual() in my UnitTests just to validate that I can do the above steps.  I 
rather hate to go to some level 3 not quite implemented techniques to do this, but I 
will if I have to.

What do you suggest to do what I am trying to do?  It seems to me with all the XML-RPC 
stuff, I have heard of, this should have been done by lots of people at this point.  
By-the-way, I would love to see some code or libraries that do the above steps, if it 
exists.

Thanks for your help.

-dh

-----Original Message-----
From: Gareth Reakes [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, October 02, 2002 11:50 AM
To: [EMAIL PROTECTED]
Subject: RE: Serialize and unserialize DOMDocument over socket


Hi,
        I completely forgot about this problem as I replaced your ns info 
with nulls. Sorry about that. I assume that WSZ_NAMESPACE_URI is not null. 
If this is the case then when you serialize it you will lose the namespace 
information. When you parse it again the elements will have a different ns 
(ie null). There is a level 3 method that "namespace normalizes" the 
document and puts in prefix bindings where required. If you applied this 
to your document prior to serialization then it should be OK. 
Unfortunately this method has not yet been implemented in xerces-c. It was 
on my todo list for this week but when I went and looked at the method 
again the scope had vastly increased. I have some quite horrible code that 
does this (but not to the new standard) and you are quite welcome to have 
that if you want.

Gareth



On Wed, 2 Oct 2002, Dave Hoffer wrote:

> Hi Gareth,
> 
> Right you are.  I have fixed this...the new code is below.  However, I have the same 
>problem, the namespaceURI's do not match (one is null).
> 
> bool IMessage::FillMsg()
> {
>       DOMImplementation* impl =  
>DOMImplementationRegistry::getDOMImplementation(L"Core");
> 
>       m_pDomDocument = impl->createDocument(
>                               WSZ_NAMESPACE_URI,    // root element namespace URI.
>                               WSZ_MSG_ROOT,         // "ATDNewsCLSMsg" root element 
>name
>                               0);                   // document type object (DTD).
> 
>       DOMElement* rootElem = m_pDomDocument->getDocumentElement();
> 
>       DOMElement* msgElem = m_pDomDocument->createElementNS(WSZ_NAMESPACE_URI, 
>               WSZ_HEADER);
>       
>       rootElem->appendChild(msgElem);
> 
>       msgElem->setAttributeNS( WSZ_NAMESPACE_URI, 
>               WSZ_PRODUCTVERSION,
>               ((CWinAppEx*)AfxGetApp())->GetApplicationProductVersion() );
> 
>       DOMElement*  typeElem = m_pDomDocument->createElementNS( WSZ_NAMESPACE_URI, 
>WSZ_TYPE);
>       rootElem->appendChild(typeElem);
> 
>       DOMText*    typeVal = m_pDomDocument->createTextNode( WSZ_MSG_POWERUP );
>       typeElem->appendChild(typeVal);
> 
>       return true;
> }
> 
> -----Original Message-----
> From: Gareth Reakes [mailto:[EMAIL PROTECTED]]
> Sent: Wednesday, October 02, 2002 11:12 AM
> To: [EMAIL PROTECTED]
> Subject: RE: Serialize and unserialize DOMDocument over socket
> 
> 
> Hi,
>       comment below
> 
> 
> On Wed, 2 Oct 2002, Dave Hoffer wrote:
> 
> > Here is the code...
> > 
> > bool IMessage::FillMsg()
> > {
> >     DOMImplementation* impl =  
>DOMImplementationRegistry::getDOMImplementation(L"Core");
> > 
> >     m_pDomDocument = impl->createDocument(
> >                             WSZ_NAMESPACE_URI,    // root element namespace URI.
> >                             WSZ_MSG_ROOT,         // "ATDNewsCLSMsg" root element 
>name
> >                             0);                   // document type object (DTD).
> > 
> >     DOMElement* rootElem = m_pDomDocument->getDocumentElement();
> > 
> >     DOMElement* msgElem = m_pDomDocument->createElementNS( WSZ_NAMESPACE_URI, 
>WSZ_HEADER );
> >     rootElem->appendChild( msgElem );
> > 
> >     msgElem->setAttribute( WSZ_PRODUCTVERSION, 
>((CWinAppEx*)AfxGetApp())->GetApplicationProductVersion() );
> 
> should be setAttributeNS
> 
> 
> 
> Gareth
> 
> 
> > 
> >     DOMNode* rootElem = m_pDomDocument->getDocumentElement();
> > 
> >     DOMElement*  typeElem = m_pDomDocument->createElementNS( WSZ_NAMESPACE_URI, 
>WSZ_TYPE );
> >       rootElem->appendChild(typeElem);
> > 
> >       DOMText*    typeVal = m_pDomDocument->createTextNode( WSZ_MSG_POWERUP );
> >       typeElem->appendChild(typeVal);
> > 
> >     return true;
> > }
> > 
> > -dh
> > 
> > 
> > 
> > -----Original Message-----
> > From: Gareth Reakes [mailto:[EMAIL PROTECTED]]
> > Sent: Wednesday, October 02, 2002 11:04 AM
> > To: [EMAIL PROTECTED]
> > Subject: RE: Serialize and unserialize DOMDocument over socket
> > 
> > 
> > Hi,
> >     post you document creation stuff (the stuff in FillDoc) and Ill 
> > have a look.
> > 
> > Gareth
> > 
> > 
> > 
> > On Wed, 2 Oct 2002, Dave Hoffer wrote:
> > 
> > > Hi,
> > > 
> > > Thank you for the replies.  I did what you said, this HAS FIXED the localName 
>issue.  Thank you very much.  However, the very next test in the isEqualNode code is 
>a check of getNamespaceURI()'s.  This fails.  
> > > 
> > > What seems to be happening is that the object that we create from the byte 
>stream seems to have the valid NamespaceURI but the orginial object does not.  What 
>would be causing this?
> > > 
> > > Again thanks for your help!
> > > 
> > > -dh
> > > 
> > > 
> > > 
> > > -----Original Message-----
> > > From: Gareth Reakes [mailto:[EMAIL PROTECTED]]
> > > Sent: Wednesday, October 02, 2002 8:30 AM
> > > To: [EMAIL PROTECTED]
> > > Subject: RE: Serialize and unserialize DOMDocument over socket
> > > 
> > > 
> > > Hi,
> > >   The problem is 2 fold. First you have not set the namespaces 
> > > feature on DOMBuilder to true - do that like this:
> > > 
> > >         pDOMBuilder->setFeature(X("namespaces"), true);
> > > 
> > > secondly you are mixing level 1 and level 2 creation methods. 
> > > createDocument uses level 2 (createElementNS) and therefore it will not 
> > > compare correctly with localName if you then create it with level 1. 
> > > Prefer using createXXXNS.
> > > 
> > > 
> > > Gareth
> > > 
> > > 
> > > 
> > > 
> > > On Tue, 1 Oct 2002, Dave Hoffer wrote:
> > > 
> > > > Hi Gareth,
> > > > 
> > > > //Here is the code that makes the DOM document...
> > > > IMessage::FillDoc()
> > > > {
> > > >         DOMImplementation* impl =  
>DOMImplementationRegistry::getDOMImplementation(L"Core");
> > > > 
> > > >         m_pDomDocument = impl->createDocument(
> > > >                                 0,                    // root element 
>namespace URI.
> > > >                                 WSZ_MSG_ROOT,         // "ATDNewsCLSMsg" root 
>element name
> > > >                                 0);                   // document type object 
>(DTD).
> > > > 
> > > >         DOMElement* rootElem = m_pDomDocument->getDocumentElement();
> > > > 
> > > >         DOMElement* msgElem = m_pDomDocument->createElement(WSZ_HEADER);
> > > >         rootElem->appendChild(msgElem);
> > > > 
> > > >         msgElem->setAttribute( WSZ_PRODUCTVERSION, 
>((CWinAppEx*)AfxGetApp())->GetApplicationProductVersion() );
> > > > 
> > > >         DOMNode* rootElem = m_pDomDocument->getDocumentElement();
> > > > 
> > > >         DOMElement*  typeElem = m_pDomDocument->createElement(WSZ_TYPE);
> > > >         rootElem->appendChild(typeElem);
> > > > 
> > > >         DOMText*    typeVal = m_pDomDocument->createTextNode( WSZ_MSG_POWERUP 
>);
> > > >         typeElem->appendChild(typeVal);
> > > > }
> > > > 
> > > > //Here is the code that converts the DOM document to a stream...
> > > > bool IMessage::CreateSeralizedXMLMemoryBuffer()
> > > > {
> > > >         DOMWriter* pDOMWriter = NULL;
> > > >         XMLFormatTarget* pXMLFormatTarget = NULL;
> > > > 
> > > >         try
> > > >         {
> > > >                 // get a serializer, an instance of DOMWriter
> > > >                 // Note: LS stands for Load & Save.
> > > >                 DOMImplementation* pDOMImplementation = 
>DOMImplementationRegistry::getDOMImplementation(L"LS");
> > > >                 if (!pDOMImplementation) return false;
> > > > 
> > > >                 pDOMWriter = 
>((DOMImplementationLS*)pDOMImplementation)->createDOMWriter();
> > > >                 if (!pDOMWriter) return false;
> > > > 
> > > >                 // set user specified end of line sequence and output encoding
> > > >                 pDOMWriter->setNewLine(g_MyEOLSequence);
> > > >                 pDOMWriter->setEncoding(WSZ_ENCODING_UNICODE_LE);
> > > > 
> > > >                 // Plug in a format target to receive the resultant
> > > >                 // XML stream from the serializer.      
> > > >                 pXMLFormatTarget = new MemBufFormatTarget();
> > > > 
> > > >                 //
> > > >                 // do the serialization through DOMWriter::writeNode();
> > > >                 //
> > > >                 if (!pDOMWriter->writeNode(pXMLFormatTarget, (const 
>DOMNode&)*m_pDomDocument))
> > > >                 {
> > > >                         delete pXMLFormatTarget;
> > > >                         pXMLFormatTarget = NULL;
> > > >                         delete pDOMWriter;
> > > >                         pDOMWriter = NULL;
> > > > 
> > > >                         return false;
> > > >                 }
> > > > 
> > > >                 delete pDOMWriter;
> > > > 
> > > >                 m_uiBufferLen = 
>((MemBufFormatTarget*)pXMLFormatTarget)->getLen();
> > > >                 
> > > >                 m_pxmlbytBuffer = new XMLByte[m_uiBufferLen + 2];
> > > >                 memcpy( m_pxmlbytBuffer, 
>(XMLByte*)((MemBufFormatTarget*)pXMLFormatTarget)->getRawBuffer(), m_uiBufferLen );
> > > >                 m_pxmlbytBuffer[m_uiBufferLen] = NULL;
> > > >                 m_pxmlbytBuffer[m_uiBufferLen+1] = NULL;
> > > > 
> > > >                 // For test purposes...it is nice to see this as a character 
>(Unicode) buffer.
> > > >                 XMLCh* pxmlchBuffer = (XMLCh*)m_pxmlbytBuffer;
> > > > 
> > > >                 delete pXMLFormatTarget;
> > > >                 pXMLFormatTarget = NULL;
> > > > 
> > > >                 return true;
> > > >         }
> > > >         catch(DOMException e)
> > > >         {
> > > >                 if (pDOMWriter)
> > > >                 {
> > > >                         delete pDOMWriter;
> > > >                         pDOMWriter = NULL;
> > > >                 }
> > > > 
> > > >                 if (pXMLFormatTarget)
> > > >                 {
> > > >                         delete pXMLFormatTarget;
> > > >                         pXMLFormatTarget = NULL;
> > > >                 }
> > > > 
> > > >                 return false;
> > > >         }
> > > > }
> > > > 
> > > > // This code takes the stream and makes a DOM Document...
> > > > DOMDocument* IMessage::BuildMsg( XMLByte* szXMLStream, unsigned int 
>uiXMLStreamLen )
> > > > { 
> > > >         // CDOMInputSourceByteStream class defined below...
> > > >         CDOMInputSourceByteStream domInputSource( szXMLStream, uiXMLStreamLen 
>);
> > > > 
> > > >         DOMImplementation* pDOMImplementation = 
>DOMImplementationRegistry::getDOMImplementation(L"LS");
> > > >         if (!pDOMImplementation) return NULL;
> > > >         DOMBuilder* pDOMBuilder = 
>((DOMImplementationLS*)pDOMImplementation)->createDOMBuilder(DOMImplementationLS::MODE_SYNCHRONOUS,
> 0);
> > > >         if (!pDOMBuilder) return NULL;
> > > > 
> > > >         DOMDocument* pDomDocument = NULL;
> > > >         DOMDocument* pDomDocumentCopy = NULL;
> > > >         try
> > > >         {
> > > >                 pDomDocument = pDOMBuilder->parse( domInputSource );
> > > >     
> > > >                 pDomDocumentCopy = (DOMDocument*)pDomDocument->cloneNode(true);
> > > > 
> > > >                 pDOMBuilder->release();
> > > >       }
> > > >       catch (...)
> > > >         {
> > > >                 return NULL;
> > > >         }
> > > >         
> > > >         return pDomDocumentCopy;
> > > > }
> > > > 
> > > > // Globals and classes used above...
> > > > static const XMLCh*             g_MyEOLSequence         = 0;
> > > > static const XMLCh*               g_MemBufId              = 
>L"ATDNewsXMLStreamID";
> > > > 
> > > > class CDOMInputSourceByteStream : public DOMInputSource
> > > > {
> > > > public:
> > > >         CDOMInputSourceByteStream( XMLByte* pxmlbytStream, unsigned int 
>uiStreamLen )
> > > >         {
> > > >                 m_pxmlchBaseURI = NULL;
> > > >                 m_pxmlchSystemId = NULL;
> > > >                 m_pxmlchEncoding = NULL;
> > > >                 m_pxmlchPublicId = NULL;
> > > >                 m_bIssueFatalErrorIfNotFound = true;
> > > > 
> > > >                 m_pxmlbytStream = pxmlbytStream;
> > > >                 m_uiStreamLen = uiStreamLen;
> > > >         }
> > > > 
> > > >         virtual BinInputStream* makeStream() const
> > > >         {
> > > >                 BinInputStream* pBinInputStream = new BinMemInputStream( 
>m_pxmlbytStream,
> > > >                         m_uiStreamLen,
> > > >                         BinMemInputStream::BufOpt_Reference );
> > > > 
> > > >                 return pBinInputStream;
> > > >         }
> > > > 
> > > >         virtual void  setEncoding (const XMLCh *const encodingStr)
> > > >         {
> > > >                 m_pxmlchEncoding = (XMLCh*)encodingStr;
> > > >         }
> > > >    
> > > >         virtual void  setPublicId (const XMLCh *const publicId)
> > > >         {
> > > >                 m_pxmlchPublicId = (XMLCh*)publicId;
> > > >         }
> > > >    
> > > >         virtual void  setSystemId (const XMLCh *const systemId)
> > > >         {
> > > >                 m_pxmlchSystemId = (XMLCh*)systemId;
> > > >         }
> > > >    
> > > >         virtual void  setBaseURI (const XMLCh *const baseURI)
> > > >         {
> > > >                 m_pxmlchBaseURI = (XMLCh*)baseURI;
> > > >         }
> > > > 
> > > >         virtual void  setIssueFatalErrorIfNotFound (const bool flag)
> > > >         {
> > > >                 m_bIssueFatalErrorIfNotFound = (XMLCh*)flag;
> > > >         }
> > > >    
> > > >         virtual const bool getIssueFatalErrorIfNotFound() const
> > > >         {
> > > >                 return m_bIssueFatalErrorIfNotFound;
> > > >         }
> > > >    
> > > >         virtual void  release ()
> > > >         {
> > > >         }
> > > > 
> > > >         virtual const XMLCh* getEncoding() const
> > > >         {
> > > >                 return m_pxmlchEncoding;
> > > >         }
> > > > 
> > > >     virtual const XMLCh* getPublicId() const
> > > >         {
> > > >                 return m_pxmlchPublicId;
> > > >         }
> > > >  
> > > >     virtual const XMLCh* getSystemId() const
> > > >         {
> > > >                 return m_pxmlchSystemId;
> > > >         }
> > > > 
> > > >     virtual const XMLCh* getBaseURI() const
> > > >         {
> > > >                 return m_pxmlchBaseURI;
> > > >         }
> > > > 
> > > > private:
> > > >         XMLCh*                  m_pxmlchBaseURI;
> > > >         XMLCh*                  m_pxmlchSystemId;
> > > >         XMLCh*                  m_pxmlchPublicId;
> > > >         XMLCh*                  m_pxmlchEncoding;
> > > >         bool                    m_bIssueFatalErrorIfNotFound;
> > > >         XMLByte*                m_pxmlbytStream;
> > > >         unsigned int    m_uiStreamLen;
> > > > };
> > > > 
> > > > I would expect the Document I started with and the Document I recreate would 
>be the same(equivalent).  My DOMDocument is contained in a IMessage object.  The 
>IMessage class has an operator== like...
> > > > 
> > > > bool IMessage::operator==(const IMessage& rhs ) const
> > > > {       
> > > >         if( m_pDomDocument)
> > > >         {
> > > >                 if( !rhs.m_pDomDocument)
> > > >                         return false;
> > > > 
> > > >                 if (!(m_pDomDocument->isEqualNode((const 
>DOMNode*)rhs.m_pDomDocument)))
> > > >                         return false;
> > > >         }
> > > >         else if( rhs.m_pDomDocument)
> > > >                 return false;
> > > > }
> > > > 
> > > > The ...isEqualNode fails when it gets to checking the localName.  It is null 
>in one object and set to a string (I forget the value) in the other.
> > > > 
> > > > Any help would be greatly appreciated.
> > > > 
> > > > -dh
> > > > 
> > > > -----Original Message-----
> > > > From: Gareth Reakes [mailto:[EMAIL PROTECTED]]
> > > > Sent: Tuesday, October 01, 2002 4:01 AM
> > > > To: [EMAIL PROTECTED]
> > > > Subject: Re: Serialize and unserialize DOMDocument over socket
> > > > 
> > > > 
> > > > Hi,
> > > >         post your code and Ill take a look.
> > > > 
> > > > 
> > > > Gareth
> > > > 
> > > > 
> > > > On Mon, 30 Sep 2002, David Hoffer wrote:
> > > > 
> > > > > I am trying to create rather simple DOM documents and send them over
> > > > > sockets, I then repackage the socket stream, on the receiving end, into DOM
> > > > > documents.
> > > > > 
> > > > > I would expect the documents to be the same, i.e. isEqualNode would return
> > > > > true.  However, it is failing at least because the LocalName is not the
> > > > > same.
> > > > > 
> > > > > Can someone help me with this?  Why does the localName not match?  I
> > > > > understand this might be a level 1 vs. 2 issue but what do I do about that?
> > > > > Is there some code where others have did something similar?
> > > > > 
> > > > > -dh
> > > > > 
> > > > > 
> > > > > 
> > > > > ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > > > > For additional commands, e-mail: [EMAIL PROTECTED]
> > > > > 
> > > > > 
> > > > 
> > > > 
> > > 
> > > 
> > 
> > 
> 
> 

-- 
Gareth Reakes, Head of Product Development  
DecisionSoft Ltd.            http://www.decisionsoft.com
Office: +44 (0) 1865 203192



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to