[Twisted-Python] xmlstream problem

Gabriel Rossetti mailing_lists at evotex.ch
Tue May 27 03:45:30 EDT 2008


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




More information about the Twisted-Python mailing list