2014-11-04 4 views
1

Я получаю файлы XML, которые могут быть не корректными, и в этом случае мне нужно их игнорировать.Как проверить правильность формирования XML в Elixir

Я использую SweetXml, который обертывает xmerl.

У меня есть пример плохо сформированного 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

Возможно, мне что-то не хватает, но что случилось с вашим прокомментированным кодом try/rescue? –

ответ

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 ИНГ и rescue Исключение в Эликсире очень редко. Вы должны разработать свое приложение с помощью дерева наблюдения, чтобы он знал, как правильно респанировать. Тогда вы можете просто let it crash, и супервайзер позаботится обо всем остальном.

+1

Спасибо. Я был уверен, что буду переборщить все комбинации - теперь я озадачен тем, что я пропустил. Я думал, что руководители будут верным путем, но это моя первая неделя Эликсира, и подумал, что это должен быть второй недельный материал. И |> to_string |> - конечно! –