簡體   English   中英

如何檢查Elixir中XML的格式是否正確

[英]How to check if XML is well-formed in Elixir

我收到的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

您使用了try/rescue ,它僅攔截異常。 另一方面,可以使用try/catch構造攔截出口:

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

但是, catchrescue異常在Elixir中非常罕見。 您應該使用監督樹來設計您的應用程序,以便它知道如何正確地重新生成自身。 然后,您可以讓它崩潰 ,然后主管將負責其余的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM