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]