[erlang-questions] xmerl scan stream

Taavi Talvik <>
Tue Dec 9 08:13:38 CET 2008


On Dec 9, 2008, at 2:10 AM, Peter Sabaini wrote:

> Hm, as an afterthought -- this still doesn't solve the original  
> problem, does
> it?
>
> Say I have this on my input stream:
>
> % telnet localhost 2345
> Trying 127.0.0.1...
> Connected to localhost.local.
> Escape character is '^]'.
> <doc>
> a
> </doc>
> <foo />
>
> -----
>
> then I only get the <doc>a</doc> structure back as soon as <foo />  
> is entered,
> correct?

I used following continuation functions:

     {Xml, _Rest} =
         xmerl_scan:string(Data,
                           [
                            {continuation_fun, fun get_more_data/3,  
{started,State#state.socket}},
                            {event_fun, fun elisa_xml_event/2}])
...

%% function to fetch more data
%% When entity is ended (set in event function), no more data is  
returned
%% When we are in middle of entiry, then wait for more data
get_more_data(ContinueF, ExceptionF, GlobalState) ->
     {Phase,Socket} = xmerl_scan:cont_state(GlobalState),
     case gen_tcp:recv(Socket, 0, ?DATA_TIMEOUT) of
         {ok, Data} ->
             ContinueF(binary_to_list(Data), GlobalState);
         {error, timeout} ->
             % if we have somthing started, we need more data
             % if ended, nothing more is needed
             case Phase of
                 started ->
                     ContinueF([], GlobalState);
                 ended ->
                     ExceptionF(GlobalState)
             end;
         _Other ->
             ExceptionF(GlobalState)
     end.

%%
%% @doc elisa_xml Event function which sets started|ended flags for  
continuation function.
elisa_xml_event(#xmerl_event{event=started}, State) ->
     {_Phase,Socket} = xmerl_scan:cont_state(State),
     xmerl_scan:cont_state({started,Socket}, State);
elisa_xml_event(#xmerl_event{event=ended}, State) ->
     {_Phase,Socket} = xmerl_scan:cont_state(State),
     xmerl_scan:cont_state({ended,Socket}, State);
elisa_xml_event(_E, State) ->
     State.


best regards,
taavi




More information about the erlang-questions mailing list