Ralph Meijer wrote:
On Wed, 2008-05-21 at 16:06 +0200, Gabriel Rossetti wrote:
Ralph Meijer wrote:
On Tue, 2008-05-20 at 17:50 +0200, Gabriel Rossetti wrote:
Hello,
I am using xmlstream.XmlStream to process...XML streams :-) I'm having a bit of a problem, I have a client and a server, both protocols inherit from xmlstream.XmlStream. When the client sends 4 messages, one after another, I get a parse error. I debugged my program, and the buffer the expat parser is given contains in effect, 4 messages consecutively like so :
str: <message>...</message><message>...</message><message>...</message><message>...</message>
(I replaced the child elements with "..." for your reading enjoyment)
and I get this Exception when debugging (otherwise it stays hidden) :
ExpatError: junk after document element: line 1, column 196
now column 196 is the end of the 1st msg's root element, I think it doesn't like the next message being right after the first.
That's right. Streaming XML, as implemented by twisted.words.xish, works by exchanging two complete (virtual) XML documents, one in each direction. So, you need to have a root element around your messages, such as 'stream'. The unit of communication is first-level elements of that root element. So, you start out with sending the start tag of the root element, and then sending the messages.
You would set up an observer for your messages like so:
def onMessage(message): print "Got message!"
factory = XmlStreamFactory() factory.addBootstrap("/message", onMessage)
I did override xmlstream.XmlStream.onDocumentEnd() because I didn't want it to close the connection in between messages, but in my method I told it to initialize the stream using :
self._initializeStream()
I did this since I noticed that closing the connection forces a new parser to be created when the previous statement is called. The reason I don't want the connection to be closed is that I'd like a persistent connection to be held.
There is no need to do this, what I showed above should meet your requirements. Also, this method is semi-private (leading _) for a reason.
Ralph,
Thank you, I understand better now, so I could send a "session" opening tag (e.g. <session_start>) from each side (one from the client when it connects and one from the server when the client connects), then exchange as manny messages as I want in between the two and then when I am done I send the closing tag (e.g. </session_start>)? Is that correct?
Yeah, that sounds right. I suggest using <stream/> as the root element.
Ralph, I just wrote a quick minimal client/server to test it, and it works great!, thanks a lot! Gabriel