erlang 相关问题

Erlang是一种通用的,垃圾收集的编程语言和运行时环境,内置支持并发,分发和容错。

如何在 Erlang 中将 XML 字符串转换为 JSON?

我想将XML字符串解析为erlang列表,然后解析为JSON。 输入示例: 我想将 XML 字符串解析为 erlang 列表,然后解析为 JSON。 输入示例: <?xml version="1.0" encoding="UTF-8"?> <!--some message here--> <start> <data> <number id="333">test message</number> <data>current date</data> </data> <mass> <client>35</client> <address>lattitude</address> <code>3454343</code> <foo tipo="casa">Some text message 2</foo> <product>TEST</product> </mass> </start> 输出应该是: { "start": { "data": { "number": { "@id": "333", "#text": "test message" }, "data": "current date" }, "mass": { "client": "35", "address": "lattitude", "code": "3454343", "foo": { "@tipo": "casa", "#text": "Some text message 2" }, "product": "TEST" } } } 我正在尝试使用 erlsom:simple_form(Xml)。 并得到: {ok,{"start",[], [{"data",[], [{"number",[{"id","333"}],["test message"]}, {"data",[],["current date"]}]}, {"mass",[], [{"client",[],["35"]}, {"address",[],["lattitude"]}, {"code",[],["3454343"]}, {"foo",[{"tipo","casa"}],["Some text message 2"]}, {"product",[],["TEST"]}]}]}, []} 现在我想删除这些空属性。有什么简单的方法可以做到这一点吗? 预先感谢。 更新:使其与解决方案一起工作 Erlang,将 xml 转换为元组和列表 但是得到 {"start", [{"data", [{"number","test message"},{"data","current date"}]}, {"mass", [{"client","35"}, {"address","lattitude"}, {"code","3454343"}, {"foo","Some text message 2"}, {"product","TEST"}]}]} 没有 [{"id","333"}] 和 [{"tipo","casa"}] 列表。 简单解析的输出采用固定格式:{Node, Attributes, Children},因此您可以编写一个简单的解析器,将您拥有的结构转换为嵌套的 proplist。这样,您可以使用 mochijson 或 jsx 将该 proplist 转换为 JSON 字符串。 -module(transform). -export([test/0]). test() -> parse(data()). parse({Node, [], [Value]}) when is_list(Value) -> [{Node, Value}]; parse({Node, [], Children}) -> V = children_to_struct(Children, []), [{Node, V}]; parse({Node, Attributes, Children}) -> V = attributes_to_struct(Attributes, []) ++ children_to_struct(Children, []), [{Node, V}]. children_to_struct([], Acc) -> Acc; children_to_struct([Value], Acc) when is_list(Value) -> Acc ++ [{"#text", Value}]; children_to_struct([Value | T], Acc) when is_tuple(Value) -> children_to_struct(T, Acc ++ parse(Value)). attributes_to_struct([], Acc) -> Acc; attributes_to_struct([{K, V}|T], Acc) -> attributes_to_struct(T, Acc ++ [{"@" ++ K, V}]). data() -> {"start",[], [{"data",[], [{"number",[{"id","333"}],["test message"]}, {"data",[],["current date"]}]}, {"mass",[], [{"client",[],["35"]}, {"address",[],["lattitude"]}, {"code",[],["3454343"]}, {"foo",[{"tipo","casa"}],["Some text message 2"]}, {"product",[],["TEST"]}]}]}. 使用 mochijson 在 shell 中运行它: Eshell V7.3 (abort with ^G) 1> c(transform). {ok,transform} 2> T = transform:test(). [{"start", [{"data", [{"number",[{"@id","333"},{"#text","test message"}]}, {"data","current date"}]}, {"mass", [{"client","35"}, {"address","lattitude"}, {"code","3454343"}, {"foo",[{"@tipo","casa"},{"#text","Some text message 2"}]}, {"product","TEST"}]}]}] 3> 4> iolist_to_binary(mochijson2:encode(T)). <<"{\"start\":{\"data\":{\"number\":{\"@id\":[51,51,51],\"#text\":[116,101,115,116,32,109,101,115,115,97,103,101]},\"data\":{\"#text"...>> 我建议对 JSON 使用 jiffy,对 XML 使用 exml。 jiffy 和 exml 具有本机代码,这意味着它们非常快。 克隆并编译它们。 在编译它们之前,您应该安装 g++ 和 libexpat-dev 示例: -module(test). -export([convert/1]). -include("exml/include/exml.hrl"). %% In my test convert(XML) when erlang:is_binary(XML) -> {ok, XMLEl} = exml:parse(XML), jiffy:encode({[convert2(XMLEl)]}). convert2(#xmlel{name = Name ,attrs = [] ,children = [{xmlcdata, Data}]}) -> {Name, Data}; convert2(#xmlel{name = Name ,attrs = Attrs ,children = Children}) -> {Name, {convert_attrs(Attrs) ++ convert_children(Children)}}. convert_attrs(Attrs) -> convert_attrs(Attrs,[]). convert_attrs([Attr|Attrs1], Attrs2) -> convert_attrs(Attrs1, [convert_attr(Attr)|Attrs2]); convert_attrs([], Attrs2) -> lists:reverse(Attrs2). convert_attr({Attr, Value}) -> {<<$@, Attr/binary>>, Value}. convert_children(Children) -> convert_children(Children, []). convert_children([Child|Children1], Children2) -> convert_children(Children1, [convert_child(Child)|Children2]); convert_children([], Children2) -> lists:reverse(Children2). convert_child({xmlcdata, Data}) -> {<<"#text">>, Data}; convert_child(#xmlel{}=XMLEl) -> convert2(XMLEl). 在外壳中: p@jahanbakhsh ~/Projects/test $ ls exml jiffy test.erl p@jahanbakhsh ~/Projects/test $ erl -pa jiffy/ebin exml/ebin Erlang/OTP 19 [erts-8.2.2] [source-1ca84a4] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] Eshell V8.2.2 (abort with ^G) 1> c(test). {ok,test} 2> XML = <<"<start><data><number id=\"333\">test message</number><data>current date</data></data><mass><client>35</client><address>lattitude</address><code>3454343</code><foo tipo=\"casa\">Some text message 2</foo><product>TEST</product></mass></start>">>. <<"<start><data><number id=\"333\">test message</number><data>current date</data></data><mass><client>35</client><address"...>> 3> test:convert(XML). <<"{\"start\":{\"data\":{\"number\":{\"@id\":\"333\",\"#text\":\"test message\"},\"data\":\"current date\"},\"mass\":{\"client\":\"35\",\"addres"...>> 4> io:format("~s~n", [test:convert(XML)]). {"start":{"data":{"number":{"@id":"333","#text":"test message"},"data":"current date"},"mass":{"client":"35","address":"lattitude","code":"3454343","foo":{"@tipo":"casa","#text":"Some text message 2"},"product":"TEST"}}} ok 5>

回答 2 投票 0

Erlang,将 xml 转换为元组和列表

我正在尝试从 xml 创建键、值对元组。我想从任何嵌套的 xml 中列出一个列表。这似乎是一个很常见的事情,但我找不到任何例子。 例如: <

回答 1 投票 0

如何将列表转换为元组列表?

我想将 [z,z,a,z,z,a,a,z] 转换为 [{z,2},{a,1},{z,2},{a,2}, {z,1}]。我该怎么做? 所以,我需要累积以前的值、它的计数器和元组列表。 我已创建记录 -记录(acc,{

回答 3 投票 0

Erlang shell 自动完成功能在 Windows 上不起作用

当我打开 erlang shell(在 cmd 或 git bash 中),并尝试使用 tab 进行自动完成时,它只是缩进。我可以以某种方式让自动完成工作吗?

回答 2 投票 0

Erlang/OTP 版本和 LTS 时间表是什么?

Erlang/OTP 发布时间表是什么?每年发布多少个主要版本?有时间表可以链接吗? 哪些主要版本有长期支持(LTS)?

回答 1 投票 0

如何在 Erlang 中使进程并行运行?

startTrains() -> 总距离 = 100, 火车 = [火车A,火车B], PID = 产卵(乐趣()-> 火车(1,长度(火车))结束), [PID! {self(),TrainData,TotalDist} ||训练数据...

回答 1 投票 0

使用牛仔示例启动应用程序时出错('noproc',ranch_listener_sup)

我正在尝试使用 rebar3 运行这个牛仔示例: 牛仔版本 2.0.0-pre.5 我所做的是: rebar3 新应用程序 hello_world 将示例 src 复制到我的 src 中 更新 rebar.config {cowboy,".*", {git,"...

回答 2 投票 0

如何在 Erlang 中同步使用端口?

我想对 Erlang 中的端口进行同步调用。也就是说,将一些输入发送到通过端口连接的正在运行的操作系统进程,并直接获取其输出,而不是使用消息。 有一个港口_...

回答 1 投票 0

SCTP 如何从服务器向多个客户端发送消息

如何识别关联 ID 以使用 sctp 协议从服务器向客户端发送消息? 在 tcp accept(ListenSocket) -> {ok, Socket} 中可以用来获取客户端的套接字号...

回答 0 投票 0

还有更好的选择吗?

感谢您查看我的问题。这是在二郎。 我有一个过程需要从数据库中获取数据,假设数据库包含三件事,即 id、请求名称和一些 o...

回答 0 投票 0

连接raw.githubusercontent.com端口443失败:连接超时

操作系统及版本:Ubuntu 22.04 LTS 在我的 Ubuntu 系统上安装 Erlang 时出现 raw.githubusercontent.com 端口 443 问题:连接超时。 asdf 安装 erlang 25.1(或安装...

回答 0 投票 0

Rebar3 Docker“由于没有这样的文件,无法加载 Rebar 依赖项”

我试图为我的应用程序设置 Dockerfile,但该应用程序还在运行时使用 Rebar3 创建了一些 Erlang 脚本。问题是当我在运行时执行 rebar3 new escript ...

回答 0 投票 0

使用 asdf 在 kali linux 上安装 erlang 版本 23.2 时出现问题

asdf 安装 erlang 正在下载克尔... % Total % Received % Xferd Average Speed Time Time Time 电流 Dload Upload Total Spent Left 速度 100 85117 100 85117 0 0 ...

回答 0 投票 0

如何从二进制中获取 N 位

我有一些二进制文件,如何从中获取 N 位? 例如:<<2#101>>如何获得第一位?

回答 2 投票 0

在erlang中正确创建子进程

我正在尝试为每个连接创建一个子进程,问题是,在子进程退出之前它不会返回。 -模块(节点主管)。 -export([start_link/0, init/1, start_child/...

回答 1 投票 0

erlang程序中trace info的结果如何解读?

这是程序 -模块(fun_param)。 -导出([开始/0,partition_parallel/2])。 partition_parallel(F, Es) -> 父母=自我(), 运行 = [{spawn_monitor(fun() -> Parent ! {self(), ...

回答 1 投票 0

使用 erlang 打开设备文件

有没有办法在erlang中打开终端设备文件? 我在 Solaris 上,正在尝试以下操作: Erlang (BEAM) 仿真器版本 5.6 [源代码] [64 位] [async-threads:0] [kernel-poll:fal...

回答 2 投票 0

DynamicSupervisor 的孩子——长时间运行的作业

假设我有一个简单的模块 defmodule MyWorker 做 def do_long_running_work(a, b, c) 做 # …… 结尾 结尾 和 DynamicSupervisor defmodule MyDynamicSupervisor 做 使用 DynamicSupervisor ...

回答 2 投票 0

当父进程死亡时,进程 send_link 不起作用,即使在取消链接后也是如此

我有 Process.send_after(self(), {:do_thing, type, x, z, 0}, 60_000) 然后,如果父进程死了,那永远不会发生 所以我试过了 {:好的,pid} = Task.start_link(fn -> 公关...

回答 1 投票 0

在 Eclipse 中运行 Erlang 应用程序抛出异常

我已经安装了 Erlang OTP 25.0、erlide 0.56.0、Eclipse 2022-09 和 Java 18。我创建了一个新的 Erlang 项目和模块。我面临两个问题。 问题#1: 当我尝试启动时出现错误...

回答 3 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.