[Twisted-Python] xmlstream problem
Gabriel Rossetti
mailing_lists at evotex.ch
Wed May 21 08:06:01 MDT 2008
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?
Thanks,
Gabriel
More information about the Twisted-Python
mailing list