如何检查Elixir中XML的格式是否正确

10 *_*cls 1 xml elixir well-formed

我收到的XML文件可能格式不正确,在这种情况下,我需要忽略它们。

我正在使用包装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
Run Code Online (Sandbox Code Playgroud)

Pat*_*ity 5

您使用try/rescue,仅拦截异常。另一方面,出口可以被try/catch构造拦截:

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

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
Run Code Online (Sandbox Code Playgroud)

但是,catching和rescueing异常在Elixir中很少见。您应该使用监督树来设计您的应用程序,以便它知道如何正确地重新生成自身。然后,您可以让它崩溃,然后主管将负责其余的工作。