mysql - erlang mysql多行结果到xml

标签 mysql xml erlang xmpp ejabberd

我在 erlang 中有 mysql select 的多行结果:

{_,_, Result} = ejabberd_odbc:sql_query(Server,
                            [<<"select group, GROUP_CONCAT(members.username separator ', ') AS member from members WHERE id='">>,Id,<<"'">>]), 

结果 = [{"群组","用户名1,用户名2,用户名3 ......"}.... {"群组","用户名1,用户名2,用户名3 ......"} ]

想要将结果转换为 xml 元素:

xml = <group "xxxxxx">
          <members>
                <member>
                   <username>xxxxxx</username>
                </member>
                <member>
                   <username>xxxxxx</username>
                </member>
                <member>
                    .........
                </member>
           </members>
       </group>
       ........
       <group "xxxxxx">
          <members>
                <member>
                   <username>xxxxxx</username>
                </member>
                <member>
                   <username>xxxxxx</username>
                </member>
                <member>
                    .........
                </member>
           </members>
       </group>

任何将其放入循环中的 xmpp iq 子元素的简单方法:

SubEl = [#xmlel{name = <<"members">>,
         attrs = [{<<"xmlns">>, ?NS_CHAT}],
         children = [#xmlel{name=<<"member">>,
                      attrs = [{<<"username">>, Username1}],
                      children = []}]
                    [#xmlel{name=<<"member">>,
                      attrs = [{<<"username">>, Username2}],
                      children = []}]
                      .............
                    }],

最佳答案

以下是一种可能适合您的方法:

create_xml() ->
  % Your result set
  Input =[{"group1","username1,username2, username3"},
          {"group2","username21,username22, username23"}],

  Result = lists:map(fun(Group) -> [group_header(element(1, Group)),
                          create_segment(Group), 
                          "</members> </group>"] 
           end, 
           Input)
lists:flatten(Result).

% Create each group segment by folding over each group 
create_segment(Group) ->
  Tokenized = string:tokens(element(2, Group), ","),
  lists:foldl(fun(UserName, Acc) ->
                [Acc, "<member> <username>", UserName, 
                 "</username>  </member>"]
              end,
              "",
              Tokenized).

group_header(GroupName) ->
  ["<group \"", GroupName, "\"", "<members>"].

运行上面的代码,我得到: t:create_xml()。

"<group \"group1\" <members> <member> <username>username1</username>  </member><member> <username>username2</username>  </member><member> <username> username3</username>  </member></members> </group><group \"group2\"<members><member> <username>username21</username>  </member><member> <username>username22</username>  </member><member> <username> username23</username>  </member></members> </group>"

关于mysql - erlang mysql多行结果到xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425968/

相关文章:

php - mysql 数据库插入将所有 ID 更改为 4294967295

mysql - cloudbees 中数据库的可见性?

javascript - sapui5中手动从XML View 转换为JavaScript View

visual-c++ - c_src\bcrypt_nif.c(94): error C2275: 'ERL_NIF_TERM' : illegal use of this type as an expression

erlang - mnesia:密集使用表

PHP、制作MySQL语句及引号的使用

mysql - 如何获取行的所有字段以及sqrt在MIN中的字段的sqrt

c++ - Xerces C++ - 加载、读取和保存,替代方案?

java - Android:四个正方形的对齐

erlang - 如何在另一个二进制文件中定义二进制文件?