[erlang-questions] xmerl scan stream
Taavi Talvik
taavi@REDACTED
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