2014-11-04 6 views
1

형식이 올바르지 않은 XML 파일을받는 중입니다.이 경우 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

아마도 여기에 뭔가 빠졌지 만 댓글이 달린 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을 보내고 Elixir에서는 예외가 발생하는 경우가 매우 드뭅니다. 감독 트리를 사용하여 응용 프로그램을 설계해야합니다. 그러면 응용 프로그램 자체를 올바르게 다시 생성하는 방법을 알 수 있습니다. 그럼 당신은 단지 let it crash 일 수 있고, 감독자가 나머지를 처리 ​​할 것입니다.

+1

감사합니다. 나는 모든 조합을 강요했다는 것을 확신했다 - 나는 내가 놓친 것에 대해 당황스러워했다. 나는 감독자가 올바른 길일 줄 알았지 만, 그것은 Elixir의 첫 주 였고, 2 주째의 재료라고 생각했다. 그리고 |> to_string | - 물론! –