Erlang xmerl_sax_parser抛出错误

时间:2012-09-24 16:31:26

标签: xml parsing erlang

我使用xmerl_sax_parser:file()解析一个非常大的文件,并在中途获得异常。

exception throw: {'EXIT',{undef,[{xmerl_sax_parser_utf8,cf,
                                                       [<<"Ä">>,
                                                        {xmerl_sax_parser_state}]}]}}

我查看了数据并且它不包含任何奇怪的字符,如果它确实如何处理它。文档没有告诉我任何事情。

代码如下所示:

run(FileName) ->
{ok, Xml, _Rest} =
   xmerl_sax_parser:file(FileName,  [{event_fun, fun event/3},
                                      {event_state, {[], ""}},
                                    {encoding, utf8},
                                    {file_type, normal},
                                    skip_external_dtd]),
Xml.

event(_Ev = {startElement, _, "product", _, _}, _Loc, _State = {Xml, _}) ->
{[[]|Xml], ""};
event(_Event = {characters, Chars}, _Location, _State = {Quotes, _}) ->
{Quotes, Chars};
event(_Ev = {endElement,_,"stock",_},_L,_State = {[Data|Rest],Chars}) ->
           Element = list_to_atom("name"),
           Updated = [{Element, Chars}|Data],
           {[Updated|Rest], undefined};
event(_Ev = {endElement,_,"date",_},_L,_State = {[Data|Rest],Chars}) ->
           Element = list_to_atom("brand"),
           Updated = [{Element, Chars}|Data],
           {[Updated|Rest], undefined};
event(_Ev = {endElement,_,"open",_},_L,_State = {[Data|Rest],Chars}) ->
           Element = list_to_atom("price"),
           Updated = [{Element, Chars}|Data],
           {[Updated|Rest], undefined};
event(_Ev = {endElement,_,"low",_},_L,_State = {[Data|Rest],Chars}) ->
           Element = list_to_atom("url"),
           Updated = [{Element, Chars}|Data],
           {[Updated|Rest], undefined};
event(_Ev = {endElement,_,"stats",_},_L,_State = {[Data|Rest],Chars}) ->
           Element = list_to_atom("category"),
           Updated = [{Element, Chars}|Data],
           {[Updated|Rest], undefined};
event(_Event, _Location, State) ->
State.

有关如何正确修复或处理的任何想法?

2 个答案:

答案 0 :(得分:0)

这部分错了,对不起:o(

  

您正在阅读的文件可能未在utf8中编码。我签到了   扩展的ASCII表,显示的奇怪char具有值   142(2#10001110)这不是有效的utf8代码:

UTF8 encoding - from wikipedia

根据此表,它是一个延续代码。因此,您可以使用十六进制编辑器检查输入文件,查找字节142(16#8E)。

编辑:我意识到我不知道使用哪种字符编码来打印异常消息。我在控制台做了一些测试,我得到了这个:

(exec@WXFRB1824L)1> L = <<"Ä">>.
<<"Ä">>
(exec@WXFRB1824L)2> size(L).  
1
(exec@WXFRB1824L)3> <<L1:4,L2:4>> = L.
<<"Ä">>
(exec@WXFRB1824L)4> L1.
12
(exec@WXFRB1824L)5> L2.
4
(exec@WXFRB1824L)6> L = <<2#11000100>>.
<<"Ä">>
(exec@WXFRB1824L)7> 2#11000100.
196

这不是打印为UTF8而是ASCII(我犯了一个错误,我找不到我得到这个值为142的地方......) 这会改变一些事情,因为根据下表,196是2字节数据的有效UT8第一个字节: enter image description here

答案 1 :(得分:0)

我发现 erlsom 库的SAX解析器非常容易使用。与xmerl相比,我建议使用它。