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.<br><br>Thanks for help,<br><br>kaiduan<br>