<!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> </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>On Sat, 14 Mar 2009 23:25 -0400, "Kaiduan Xie" <kaiduanx@gmail.com> wrote:</div>
<div> </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 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 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>