[Twisted-Python] xmlstream problem
twisted at ralphm.ik.nu
Thu May 22 11:16:05 EDT 2008
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.
> 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.
More information about the Twisted-Python