0

我正在使用 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.

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

4

2 回答 2

0

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

于 2012-09-25T08:03:05.797 回答
0

这部分是错误的,对不起:o(

可能是您正在阅读的文件未以 utf8 编码。我检查了扩展的 ASCII 表,显示的奇怪字符的值 142 (2#10001110) 不是有效的 utf8 代码:

UTF8 编码 - 来自维基百科

根据这个表,它是一个延续代码。因此,您可以使用十六进制编辑器检查您的输入文件,查找字节 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 第一个字节: 在此处输入图像描述

于 2012-09-25T04:27:55.930 回答