2012-09-24 21 views
0

我使用xmerl_sax_parser:file()解析一個非常大的文件,並在中途得到一個異常。Erlang xmerl_sax_parser引發錯誤

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

這很奇怪;有人試圖調用'xmerl_sax_parser_utf8:cf/2',但我的版本只有'cf/3','cf/4'和'cf/5' ......這是哪個Erlang版本? – legoscia

回答

0

這部分是錯了,對不起:O(

可能是你正在閱讀的UTF8沒有編碼的文件,我在 擴展ASCII表檢查,所顯示的怪異char的值 142(2#10001110),其不是有效的UTF8代碼:根據該表

UTF8 encoding - from wikipedia

,它是一個繼續代碼。因此,您可以使用十六進制編輯器查找輸入文件,查找字節142(16#8E)。

編輯:我意識到,我不知道是哪個字符編碼用於打印異常消息。我在一個控制檯做了一些測試,我得到這個:

([email protected])1> L = <<"Ä">>. 
<<"Ä">> 
([email protected])2> size(L). 
1 
([email protected])3> <<L1:4,L2:4>> = L. 
<<"Ä">> 
([email protected])4> L1. 
12 
([email protected])5> L2. 
4 
([email protected])6> L = <<2#11000100>>. 
<<"Ä">> 
([email protected])7> 2#11000100. 
196 

這不是打印爲UTF8但ASCII(我犯了一個錯誤,我無法找到在那裏我得到的142這個值...) 這變化的東西,因爲196是一個有效的UT8第一個字節爲2個字節的數據按照下表: enter image description here

+0

謝謝Pascal,我們會研究它。 –

+0

它看起來像Ä然而它是一個Ã。 –

0

我發現SAX解析器erlsom庫多非常容易使用。與xmerl相比,我推薦使用它。