Thank you, Mickael for quick answer.<br><br>I think this is expat's feature, I also wrote a small test program in c, and the behaviour is same. If I want to reuse the same parser, I need to call XML_ParserReset, and set all the handlers.<br>
<br>kaiduan<br><br><div class="gmail_quote">On Sun, Mar 15, 2009 at 4:40 AM, Mickaël Rémond <span dir="ltr"><<a href="mailto:mickael.remond@process-one.net">mickael.remond@process-one.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><div style="font-family: Arial; font-size: medium;" dir="ltr"><div>Hello,</div>
<div> </div>
<div>
<div>Successive parse steps consider it is the same document. You can have only one root XML element in an XML document.</div>
<div>Note that ejabberd parser is build to parse XMPP and some of the features are XMPP oriented (not general XML).</div>
<div> </div>
</div><div><div></div><div class="h5">
<div>On Sat, 14 Mar 2009 23:25 -0400, "Kaiduan Xie" <<a href="mailto:kaiduanx@gmail.com" target="_blank">kaiduanx@gmail.com</a>> wrote:</div>
<div> </div>
<blockquote type="cite">Hi all,<br>
<br>
Driven by the interest in Erlang, I started digging into Ejabberd source code (Learning the best open source Erlang project is a good way to get familiar with Erlang). I got a problem on XML parsing. What I did was copying the expat_er.so, and modifying the xml_stream.erl,<br>
<br>
kaiduanx@kaiduanx-desktop:~/learn-erl/xml$ ls<br>
expat_erl.c expat_erl.so Makefile xml_stream.beam xml_stream.erl<br>
kaiduanx@kaiduanx-desktop:~/learn-erl/xml$ erl<br>
Erlang (BEAM) emulator version 5.6.5 [source] [async-threads:0] [hipe] [kernel-poll:false]<br>
<br>
Eshell V5.6.5 (abort with ^G)<br>
1> xml_stream:load().<br>
ok<br>
2> Port = xml_stream:new().<br>
#Port<0.411><br>
3> xml_stream:parse(Port, "<people>Terry</people>").<br>
xml_stream_parse: [{0,{"people",[]}},{2,<<"Terry">>},{1,"people"}]<br>
<<131,108,0,0,0,1,104,2,97,0,104,2,107,0,6,112,101,111,<br>
112,108,101,106,108,0,0,0,1,104,2,...>><br>
4> xml_stream:parse(Port, "<people>Terry</people>").<br>
xml_stream_parse: [{3,{9,"junk after document element"}}]<br>
<<131,108,0,0,0,1,104,2,97,3,104,2,97,9,107,0,27,106,117,<br>
110,107,32,97,102,116,101,114,32,100,...>><br>
5> <br>
<br>
kaiduanx@kaiduanx-desktop:~/learn-erl/xml$ more xml_stream.erl <br>
-module(xml_stream).<br>
<br>
-export([load/0,<br>
new/0,<br>
parse/2,<br>
close/1]).<br>
<br>
-define(XML_START, 0).<br>
-define(XML_END, 1).<br>
-define(XML_CDATA, 2).<br>
-define(XML_ERROR, 3).<br>
<br>
-define(PARSE_COMMAND, 0).<br>
-define(PARSE_FINAL_COMMAND, 1).<br>
<br>
load() -><br>
case erl_ddll:load_driver(".", "expat_erl") of<br>
ok -> ok;<br>
{error, already_loaded} -> ok;<br>
_ -> exit({error, couldnot_load_driver})<br>
end.<br>
<br>
new() -><br>
open_port({spawn, expat_erl}, [binary]).<br>
<br>
parse(Port, Str) -><br>
Res = port_control(Port, ?PARSE_COMMAND, Str),<br>
io:format("xml_stream_parse: ~p~n", [binary_to_term(Res)]),<br>
Res.<br>
<br>
close(Port) -><br>
port_close(Port).<br>
<br>
The problem is: why expat said "junk after document element"? The first parse succeeded.</blockquote><blockquote type="cite"><br>
</blockquote><blockquote type="cite"><br>
</blockquote><blockquote type="cite"><br>
Thanks for help,<br>
<br>
kaiduan<br>
</blockquote></div></div></div><font color="#888888"><pre>--
Mickaël Rémond
<a href="mailto:mickael.remond@process-one.net" target="_blank">mickael.remond@process-one.net</a>
</pre>
</font></div><br>_______________________________________________<br>
ejabberd mailing list<br>
<a href="mailto:ejabberd@jabber.ru">ejabberd@jabber.ru</a><br>
<a href="http://lists.jabber.ru/mailman/listinfo/ejabberd" target="_blank">http://lists.jabber.ru/mailman/listinfo/ejabberd</a><br>
<br></blockquote></div><br>