【问题标题】:erlang mysql result to xmlerlang mysql结果到xml
【发布时间】:2011-07-25 22:40:03
【问题描述】:

我有一个输出:

MysqlResult = {selected,["id","first_name","last_name"],
         [{1,"Matt","Williamson"},
         {2,"Matt","Williamson2"}]}

如何让它看起来像:

XML = "
 <result id='1'>
 <first_name>Matt</first_name>
 <last_name>Williamson</last_name>
 </result>
 <result id='2'>
 <first_name>Matt</first_name>
 <last_name>Williamson2</last_name>
 </result>"

我正在寻找一种将其放入 IQ (ejabberd) 的智能方法

IQ#iq{type = result, sub_el =
                   [{xmlelement, "result",
                   [{"xmlns", ?NS_NAMES}],
                   [{xmlelement, "userinfo", [],
                   [{xmlcdata,"???"??  }]}]}]}

【问题讨论】:

    标签: mysql xml erlang xmpp


    【解决方案1】:

    首先从元组中提取结果元素:

    {selected, _Columns, Results} = MysqlResult.
    

    然后使用列表推导将其转换为 ejabberd 的内部 XML 格式:

    XML = [{xmlelement, "result", [{"id", integer_to_list(Id)}],
            [{xmlelement, "first_name", [], [{xmlcdata, FirstName}]},
             {xmlelement, "last_name", [], [{xmlcdata, LastName}]}]}
           || {Id, FirstName, LastName} <- Results].
    

    并将其插入您的智商记录:

    IQ#iq{type = result, sub_el =
                       [{xmlelement, "result",
                       [{"xmlns", ?NS_NAMES}],
                       [{xmlelement, "userinfo", [],
                       XML}]}]}
    

    (假设您希望 &lt;result/&gt; 元素作为 &lt;userinfo/&gt; 元素的子元素)

    【讨论】:

      【解决方案2】:

      使用xmerl 在 Erlang 中创建 XML:

      1> MysqlResult = {selected,["id","first_name","last_name"],
      1>          [{1,"Matt","Williamson"},
      1>          {2,"Matt","Williamson2"}]}.
      {selected,["id","first_name","last_name"],
                [{1,"Matt","Williamson"},{2,"Matt","Williamson2"}]}
      
      2> {selected, _Columns, Results} = MysqlResult.
      {selected,["id","first_name","last_name"],
                [{1,"Matt","Williamson"},{2,"Matt","Williamson2"}]}
      
      3> Content = [{result, [{id, Id}], [{first_name, [First]}, {last_name, [Last]}]} || {Id, First, Last} <- Results].
      [{result,[{id,1}],
               [{first_name,["Matt"]},{last_name,["Williamson"]}]},
       {result,[{id,2}],
               [{first_name,["Matt"]},{last_name,["Williamson2"]}]}]
      
      4> xmerl:export_simple(, xmerl_xml).
      ["<?xml version=\"1.0\"?>",
       [[["<","result",[[" ","id","=\"","1","\""]],">"],
         [[["<","first_name",">"],["Matt"],["</","first_name",">"]],
          [["<","last_name",">"],
           ["Williamson"],
           ["</","last_name",">"]]],
         ["</","result",">"]],
        [["<","result",[[" ","id","=\"","2","\""]],">"],
        [[["<","first_name",">"],["Matt"],["</","first_name",">"]],
          [["<","last_name",">"],
           ["Williamson2"],
           ["</","last_name",">"]]],
         ["</","result",">"]]]]
      
      5> io:format("~s", [v(-1)]).
      <?xml version="1.0"?><result id="1"><first_name>Matt</first_name><last_name>Williamson</last_name></result><result id="2"><first_name>Matt</first_name><last_name>Williamson2</last_name></result>ok
      

      【讨论】:

      • 是的,这是一种方式。我试过lists:flatten(xmerl:export_simple([MysqlResult], xmerl_xml)).,但它不喜欢mysql输出。
      • 您需要将其转换为xmerl:export_simple/2 喜欢的格式(请参阅文档)。我添加了一个例子。本质上,您在导出之前在 Erlang 中创建类似 XML 的简单结构。
      【解决方案3】:

      尝试在 mysql 命令行客户端中使用 --xml 和 --execute 选项。

      mysql client

      【讨论】:

      • 查询是在 erlang 中生成的 - 并返回到 erlang - 使用外部 mysql 客户端不是解决方案。即使我真的不需要 XML 变量 - 我想将 MysqlResult 放置到 IQ 。所以看起来我缺少两件事 - 1. MysqlResult 操作,2. IQ xml 格式
      【解决方案4】:

      xmerl 解决方案绝对没问题,如果这是一次性类型的东西,这可能是可行的方法。

      但是,如果您正在编写一个 xmpp 客户端,即使是一个简单的客户端,也可以考虑使用 exmpp - https://github.com/processone/exmpp 。您可以使用一些策略来提取数据并生成 XML,但总的来说,辅助函数(很可能在 exmpp_iq 和 exmpp_stanza 模块中)会非常方便。

      exmpp 也不会去任何地方——ejabberd3 的 alpha 正在内部使用它(最终)

      【讨论】:

        猜你喜欢
        • 2016-09-22
        • 1970-01-01
        • 1970-01-01
        • 2010-09-07
        • 2014-06-05
        • 1970-01-01
        • 2018-06-16
        • 2019-02-15
        • 2019-03-13
        相关资源
        最近更新 更多