2014-11-04 82 views
1

我收到的XML文件可能不完整,在這種情況下,我需要忽略它們。如何檢查XML是否在Elixir中格式正確

我正在使用包裝xmerl的SweetXml。

我有兩個屬性之間沒有空格的示例格式錯誤的XML。

沒有is_well_formed函數 - 有一個簡單的布爾響應會很好。

Xmerl嘗試解析文件,不喜歡它,因此發送出口。

我還沒有聽說過主管,但這在我看來就像是一個案例。

是否有菜鳥或簡單的方式來處理退出信號?

defmodule XmlIsWellFormed.WellFormed do 
    def is_well_formed(xml) do 
    import SweetXml 
    xml_string = to_string xml 
    result = xml_string |> parse # parse sends exit. 

    # FYI - SweetXml.parse : 
    # def parse(doc) do 
    #  {parsed_doc, _} = :xmerl_scan.string(doc) 
    #  parsed_doc 
    # end 

    # Note:  inspecting result is no use because xmerl sends an exit with: 
    #   "whitespace_required_between_attributes" 

    # Something like this would be handy: 
    # try do 
    #  result = :xmerl_scan.string(xml) 
    # rescue 
    #  :exit, _ -> nil 
    # end 
    end 
end 

rubbish_xml = '<rubbishml><html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US"xmlns:og="http://ogp.me/ns#" xmlns:fb="http://www.facebook.com/2008/fbml"></rubbishml>' 
XmlIsWellFormed.WellFormed.is_well_formed rubbish_xml 
+0

也許我在這裏錯過了一些東西,但是您評論過的嘗試/救援代碼有什麼問題? – 2014-11-05 00:43:24

回答

3

您使用了try/rescue,它只攔截異常。退出,而另一方面,可以用try/catch construct截獲:

def is_well_formed(xml) do 
    try do 
    xml |> to_string |> parse 
    true 
    catch 
    :exit, _ -> false 
    end 
end 

IEX將打印退出消息到控制檯,但程序將繼續執行:

iex> XmlIsWellFormed.WellFormed.is_well_formed ~s(<a b=""c=""/>) 
3437- fatal: {whitespace_required_between_attributes} 
false 

iex> XmlIsWellFormed.WellFormed.is_well_formed ~s(<a b="" c=""/>) 
true 

然而,catch荷蘭國際集團在Elixir中非常罕見。你應該用監督樹來設計你的應用程序,以便它知道如何正確地重新生成自己。那麼你可以只需let it crash,主管將負責其餘的事情。

+1

謝謝。我確信我會蠻橫逼迫所有組合 - 我現在對我錯過的東西感到困惑。我認爲主管將是正確的方式,但這是我第一個藥劑周,並認爲這應該是第二週的材料。並且| | to_string |> - 當然! – 2014-11-05 13:22:35

相關問題