我使用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.
有关如何正确修复或处理的任何想法?
答案 0 :(得分:0)
这部分错了,对不起:o(
您正在阅读的文件可能未在utf8中编码。我签到了 扩展的ASCII表,显示的奇怪char具有值 142(2#10001110)这不是有效的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第一个字节:
答案 1 :(得分:0)
我发现 erlsom
库的SAX
解析器非常容易使用。与xmerl相比,我建议使用它。