我有这个XML:
<message from="adminhash@localhost/xmpphp2" to="queue@springfruitdev"
type="service" id="service1"><body>JSON</body></message>
我想在标签之间提取文字。
以下是如何在erlang中表示的:
{xmlel,<<"message">>,
[{<<"xml:lang">>,<<>>},
{<<"from">>,<<"adminhash@localhost/xmpphp2">>},
{<<"to">>,<<"queue@springfruitdev">>},
{<<"type">>,<<"service">>},
{<<"id">>,<<"service1">>}],
[{xmlel,<<"body">>,[],[{xmlcdata,<<"JSON">>}]}]}}
我通过模式匹配尝试了什么:
element(1,list_to_tuple(element(4,element(3,X)))).
结果:
{xmlel,<<"body">>,[],[{xmlcdata,<<"JSON">>}]}
首先,我能以更优雅的方式提取xmlcdata吗?
答案 0 :(得分:6)
xml.erl中的另一个选项是函数
的xml:get_path_s / 2
<强> TL; DR; 强>
获取body cdata,您将使用以下
>xml:get_path_s(El,[{elem,"body"},cdata]).
"JSON"
更多数据
你提供的Xml有第一个参数,第二个参数是带有以下sintax的列表,
我将提供以下示例以便更好地理解。 想象一下你的xml是以下
<message from="adminhash@localhost/xmpphp2" to="queue@springfruitdev"
type="service" id="service1">
<body>JSON</body>
<writer id="123">
<name>William</name>
<country>England</country>
</writer>
</message>
您有以下调用和结果。
>xml:get_path_s(El,[{elem,"body"},cdata]).
"JSON"
>xml:get_path_s(El,[{elem,"body"}]).
{xmlel,"body",[],[{xmlcdata,<<"JSON">>}]}
>xml:get_path_s(El,[{attr,"type"}]).
"service"
>xml:get_path_s(El,[{elem,"writer"},{elem,"name"},cdata]).
"William"
>xml:get_path_s(El,[{elem,"writer"},{attr,"id"}]).
"123"
答案 1 :(得分:3)
您可以使用xml.erl
中的一些功能:
> xml:get_tag_cdata(xml:get_subtag(X, <<"body">>)).
<<"JSON">>
即,获取body
子元素,然后从中获取所有字符数据。