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) を探す 16 進エディタで入力ファイルを調べることができます。

編集:例外メッセージの出力に使用される文字エンコーディングがわからないことに気付きました。コンソールでいくつかのテストを行ったところ、次のようになりました。

(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 に答える