最近Erlang项目中有用到xml处理,简单研究了,主要查找erlang库中xmerl的初学文档(lib/xmerl-1.2.8/doc/html/xmerl_ug.html)。
并参考坚强2002的博客:http://www.cnblogs.com/me-sa/archive/2012/07/20/erlang_xml.html
废话不多说,上代码:
直接用官方给出的xml示例来处理(motorcycles.xml):
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE motorcycles SYSTEM "motorcycles.dtd"> <motorcycles> <bike year="2000" color="black"> <name> <manufacturer>Suzuki</manufacturer> <brandName>Suzuki VL 1500</brandName> <additionalName>Intruder</additionalName> </name> <engine>V-engine, 2-cylinders, 1500 cc</engine> <kind>custom</kind> <drive>cardan</drive> <accessories>Sissy bar, luggage carrier,V&H exhaust pipes</accessories> </bike> <date>2004.08.25</date> <bike year="1983" color="read pearl"> <name> <manufacturer>Yamaha</manufacturer> <brandName>XJ 400</brandName> </name> <engine>4 cylinder, 400 cc</engine> <kind>alround</kind> <drive>chain</drive> <comment>Good shape!</comment> </bike> </motorcycles>
如果xmerl_scan:file("motorcycles.xml"),报错,则请删除xml文件中DTD声明或者使用
xmerl_scan:file("motorcycles.xml", [{validation,false}]),
%% 取xml中bike属性year
get_attr_val() ->
{Result, _Rest} = xmerl_scan:file("motorcycles.xml"),
Years = xmerl_xpath:string("bike/@year", Result),
io:format("Format=====Years=====~p~n", [Years]),
lists:foldl(fun(K, Acc) ->
#xmlAttribute{value=Val} = K,
[{"year", Val}|Acc] end, [], Years).
执行结果:[{"year","1983"},{"year","2000"}]
%% 取xml中date值
get_xml_date() ->
{Result, _Rest} = xmerl_scan:file("motorcycles.xml"),
Date = xmerl_xpath:string("date", Result),
[#xmlElement{content = Content}] = Date,
[#xmlText{value = Val}] = Content,
{"date", Val}.
执行结果:{"date","2004.08.25"}
%% 取xml中name节点下manufacturer的值
get_xml_names() ->
{Result, _Rest} = xmerl_scan:file("motorcycles.xml"),
Bikes = xmerl_xpath:string("bike", Result),
NameVals = lists:foldl(fun(K, Acc) ->
Name = xmerl_xpath:string("name/manufacturer", K),
[#xmlElement{content = [#xmlText{value = Val}]}] = Name,
[{"manufacturer", Val}|Acc] end, [], Bikes),
lists:reverse(NameVals).
执行结果:[{"manufacturer","Suzuki"},{"manufacturer","Yamaha"}]
%% 转换xml
gen_xml_list() ->
XmlData = {bike, [{year,"2003"},{color,"black"},{condition,"new"}],
[{name, [{manufacturer,["Harley Davidsson"]},
{brandName,["XL1200C"]},
{additionalName,["Sportster"]}]},
{engine, ["V-engine, 2-cylinders, 1200 cc"]},
{kind,["custom"]},
{drive,["belt"]}]},
XmlLists = xmerl:export_simple([XmlData],xmerl_xml),
lists:flatten(XmlLists).
执行结果:"<?xml version=\"1.0\"?><bike year=\"2003\" color=\"black\" condition=\"new\">
<name><manufacturer>Harley Davidsson</manufacturer><brandName>XL1200C</brandName>
<additionalName>Sportster</additionalName></name><engine>V-engine, 2-cylinders, 1200 cc</engine>
<kind>custom</kind><drive>belt</drive></bike>"
相关推荐
erlsom:用于Erlang的XML解析器
exomler:用于Erlang的快速XML解析器
fast_xml:基于Fast Expat的Erlang XML解析库
exml是一个Erlang库,有助于解析XML流和进行一些基本的XML结构操作。 建造 exml是与钢筋兼容的OTP应用程序,请运行make或./rebar compile以进行构建。 根据要求,需要expat库的开发标头。 使用 exml可以一次解析...
erlxml:erlxml-基于pugixml的Erlang XML解析库
该方法与 , 或非常相似:将XML元素转换为内部语言结构(在我们的情况下为Erlang记录),该过程称为“解码”。 在解码期间,还会执行验证,因此会生成类型良好的结构,从而可能减少与手工解析有关的错误。 反向过程...
yaccety_sax:BEAM语言的快速,选择性XML拉式解析器
用于XML解析的Erlang库。 它支持多种操作模式:作为高效的SAX解析器,简单的类似DOM的解析器或“数据映射器”。 数据映射器根据XML模式将XML文档转换为Erlang记录。
xmlrpc 这是 Elixir 中非常简约的 XML-RPC 客户端的第一次尝试,使用 HTTPoison 作为传输层。 我自己的项目需要一个客户端来与 Confluence wiki 对话,但无法让任何现有的...要么是捕获 XML 输出并将其直接提供给解析器
asp.lang erlang.lang logtalk.lang pl1.lang squirrel.lang aspect.lang euphoria.lang lotos.lang plperl.lang styl.lang assembler.lang express.lang lotus.lang plpython.lang swift.lang ats.lang fame.lang ...