<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><title></title><style type="text/css">body{padding:1ex;margin:0px;font-family:sans-serif;font-size:small;}a[href]{color:-moz-hyperlinktext !important;text-decoration:-moz-anchor-decoration;}blockquote{margin:0;border-left:2px solid #144fae;padding-left:1em;}blockquote blockquote{border-color:#006312;}blockquote blockquote blockquote{border-color:#540000;}</style></head><body><div style="font-family: Arial; font-size: medium;" dir="ltr"><div>Hello,</div>
<div>&nbsp;</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>&nbsp;</div>
</div>
<div>On Sat, 14 Mar 2009 23:25 -0400, &quot;Kaiduan Xie&quot; &lt;kaiduanx@gmail.com> wrote:</div>
<div>&nbsp;</div>
<blockquote class="QuoteMessage" 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&nbsp; expat_erl.so&nbsp; Makefile&nbsp; xml_stream.beam&nbsp; 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&nbsp; (abort with ^G)<br>
1> xml_stream:load().<br>
ok<br>
2> Port = xml_stream:new().<br>
#Port&lt;0.411><br>
3> xml_stream:parse(Port, &quot;&lt;people>Terry&lt;/people>&quot;).<br>
xml_stream_parse: [{0,{&quot;people&quot;,[]}},{2,&lt;&lt;&quot;Terry&quot;>>},{1,&quot;people&quot;}]<br>
&lt;&lt;131,108,0,0,0,1,104,2,97,0,104,2,107,0,6,112,101,111,<br>
&nbsp; 112,108,101,106,108,0,0,0,1,104,2,...>><br>
4> xml_stream:parse(Port, &quot;&lt;people>Terry&lt;/people>&quot;).<br>
xml_stream_parse: [{3,{9,&quot;junk after document element&quot;}}]<br>
&lt;&lt;131,108,0,0,0,1,104,2,97,3,104,2,97,9,107,0,27,106,117,<br>
&nbsp; 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>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new/0,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parse/2,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; close/1]).<br>
<br>
-define(XML_START, 0).<br>
-define(XML_END,&nbsp;&nbsp; 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>
&nbsp;&nbsp; case erl_ddll:load_driver(&quot;.&quot;, &quot;expat_erl&quot;) of<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ok -> ok;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {error, already_loaded} -> ok;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _ -> exit({error, couldnot_load_driver})<br>
&nbsp;&nbsp; end.<br>
&nbsp;<br>
new() -><br>
&nbsp;&nbsp;&nbsp; open_port({spawn, expat_erl}, [binary]).<br>
<br>
parse(Port, Str) -><br>
&nbsp;&nbsp;&nbsp; Res = port_control(Port, ?PARSE_COMMAND, Str),<br>
&nbsp;&nbsp;&nbsp; io:format(&quot;xml_stream_parse: ~p~n&quot;, [binary_to_term(Res)]),<br>
&nbsp;&nbsp;&nbsp; Res.<br>
<br>
close(Port) -><br>
&nbsp;&nbsp;&nbsp; port_close(Port).<br>
<br>
The problem is: why expat said &quot;junk after document element&quot;? The first parse succeeded.</blockquote><blockquote class="QuoteMessage" type="cite"><br type="_moz">
</blockquote><blockquote class="QuoteMessage" type="cite"><br type="_moz">
</blockquote><blockquote class="QuoteMessage" type="cite"><br>
Thanks for help,<br>
<br>
kaiduan<br type="_moz">
</blockquote></div><pre>-- 
  Mickaël Rémond
  mickael.remond@process-one.net
</pre>
</body></html>