Thank you.

I have tried this and it WORKS.

-dh

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


Hi,
        If you just pass in 0 for the uri bit of the create methods tehn 
it should all work. It does for me. 


Gareth



On Wed, 2 Oct 2002, Dave Hoffer wrote:

> 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