Characteristics
XML handling operation has two major phases.
- Parse XML document and make data(tree of elements)
- xmerl_scan (whole element tree is processed at once)
- SAX type parser
- xmerl_eventp
- erlsom_sax (developed 3rd party. not bundled with Erlang OTP)
- Access (traverse) elements within data
- XPATH (xmerl_xpath)
- XSLT (xmerl_xs)
- callback (hook) function from SAX type parser
- hand-made logic
- traverse tree
- extract tuple from element tree(list) by 'list comprehension' technique
So, methodology of XML parsing is characterized by Parsing and Access method
matrix of each method
| parse method | Acceess method | samples on the Web | by | |
| xmerl_scan | xmerl_xpath | Parsing Atom with Erlang | Sam Ruby | |
| xmerl_scan | xmerl_xpath (with useful MACRO) | XML processing in Erlang | Torbjörn Törnkvist | |
| xmerl_scan | hand-made (traverse tree by lists:foldl) | Return Erlang Data from XML | Muharem Hrnjadovic | |
| xmerl_scan | hand-made (use list comprehension) |
| Hakan Mattson | |
| xmerl_eventp | callback(hook) function |
| Torbjörn Törnkvist | |
| erlsom_sax | callback function |
| Willem de Jong |
Operation example
example-1 : emerl_scan + xpath
If you know which elements you need exactly, and source XML file is not so huge, parse by xmerl_scan, access by xmerl_xpath.
Note: As of Erlang/OTP R13B01 supports XPATH 1.0
inspired by Torbjörn Törnkvist's code.
sample xml data ("e.xml")
<Envelope><Title>envelope title</Title>
<InnerEnv>
<IDNUM>403276</IDNUM>
<ItemName>Name String</ItemName>
<Pages>0</Pages>
</InnerEnv>
</Envelope>
code
-module(example1).
-export([doit/1]).
-include_lib("xmerl/include/xmerl.hrl").
-define(Val(X),
(fun() ->
[#xmlElement{name = N,
content = [#xmlText{value = V}|_]}] = X,
{N,V} end)())
.
doit(File) ->
{Xml, _} = xmerl_scan:File(File),
[
?Val(xmerl_xpath:string("/Envelope/Title", Xml)),
?Val(xmerl_xpath:string("//IDNUM", Xml)),
?Val(xmerl_xpath:string("//ItemName", Xml)),
?Val(xmerl_xpath:string("//Pages", Xml))
]
.
results
1> example1:go("e.xml").[
{'Title',"envelope title"},
{'IDNUM',"403276"},
{'ItemName',"Name String"},
{'Pages',"0"}]
example-2 : xmerl_scan + traverse element tree by lists:foldl
if you want to translate whole XML data into other scheme, you need to traverse whole tree by lists:foldl function.
inspired by Muharem Hrnjadovic's code
sample xml data ("e.xml")
<Envelope><Title>envelope title</Title>
<InnerEnv>
<IDNUM>403276</IDNUM>
<ItemName>Name String</ItemName>
<Pages>0</Pages>
</InnerEnv>
</Envelope>
code
-module(example2).-export([go/1]).
-include_lib("xmerl/include/xmerl.hrl").
go(File) -> {R, _} = xmerl_scan:file(File),
io:format("~p~n",[lists:reverse(traverse(R, []))]) .
traverse(R, L) when is_record(R, xmlElement) -> lists:foldl(fun traverse/2, L, R#xmlElement.content) ;
traverse(#xmlText{parents=[{'Title',_},_], value=V}, L) -> [{title, V}|L];
traverse(#xmlText{parents=[{'IDNUM',_},_,_], value=V}, L) -> [{idnum, V}|L];
traverse(#xmlText{parents=[{'ItemName',_},_,_], value=V}, L) -> [{itemname, V}|L];
traverse(#xmlText{parents=[{'Pages',_},_,_], value=V}, L) -> [{pages, V}|L];
traverse(_R, L) ->
L
.
results
2> example2:go("e.xml"). [{title,"envelope title"},
{idnum,"403276"},
{itemname,"Name String"},
{pages,"0"}]
example-3 : SAX type parsing operation
if the computation resouce is limited, whole XML data cannot be processed at once. So, SAX type parser callback functions to process just parsed element.
As SAX type parser, erlsom_sax is welknown. And Willem de Jong posted his code based on erlsom_sax.
see http://blog.tornkvist.org/blog.yaws?id=1193209275268448
here is the code based on xmerl_sax_parser library which is inspired by above code.
sample xml data ("e.xml")
<Envelope>
<Title>envelope title</Title>
<InnerEnv>
<IDNUM>403276</IDNUM>
<ItemName>Name String</ItemName>
<Pages>0</Pages>
</InnerEnv>
</Envelope>
code
-module(example3).-export([go/1]).
go(File) ->
Option = [ {event_fun, fun eventfun/3}, {event_state, {[], []}} ], case xmerl_sax_parser:file(File, Option) of
{ok,{Stack, Acc}} -> lists:reverse(Acc);
{Other} -> Other
end .
eventfun({ignorableWhitespace, _}, _, State) ->
State ;
eventfun({startElement, _, Tag, _, _}, _Location, {Stack, Acc}) -> {[Tag | Stack], Acc} ;
eventfun({characters, Value}, _Location, {[Tag | _L] = Stack, Acc}) -> {Stack, [{Tag, Value} | Acc]} ;
eventfun({endElement, _, _, _}, _Location, {[_ | L], Acc}) -> {L, Acc} ;
eventfun(_,_,State) -> State .
results
6> example3:go("e.xml").
[{"Title","envelope title"},
{"IDNUM","403276"},
{"ItemName","Name String"},
{"Pages","0"}]
You may want to look at vtd-xml which is a lot easier than SAX...
ReplyDeleteThere is also xmerl_sax_parser, new in R13.
ReplyDelete每一個人無論怎樣渺小,在自己的眼中,都自有其份量..................................................
ReplyDelete相見亦無事,不來常思君..................................................
ReplyDelete辛苦了!祝你愈來愈好!........................................
ReplyDelete0401影音成人影片交流愛撫淫叫色情照片性愛圖片女生如何自慰激突成人論壇美女脫胸罩走光一夜正妹視訊情人性愛論壇85cc影城性伴侶85cc色情影片打手槍情色視訊聊天室色情a片色情色情圖片限制級照片色情電話520sex免費色情網情色性愛一夜情聊天網成人聊天網視訊成人台灣性網av一夜女情色av淫女免費視訊美女挑逗情色影音聊天作愛影片辣妹清涼秀美女做愛成人自拍貼圖成人資訊色論壇台灣色情成人網站色情視訊聊天露三點打砲情色性愛貼圖av成人網成人影片
ReplyDeleteThe tribe standard is very good continues to refuel
ReplyDelete...................................................
The tribe standard is very good continues to refuel
ReplyDelete..............................................
免費影音視訊 ■Show Girl視訊 聊天室 ■色情狂小說 ■視訊色妹妹 ■完美視訊聊天室 ■sex999免費影片 ■視訊美女影音 ■熟女人aa影片 ■比基尼辣妹圖片 h ■免費播放視訊 美女 ■辣妹護士俱樂部影片 ■啦咧影音聊天室 vista ■南部人聊天室 ut 女同 ■色情片線上看 ■影音聊天室 no9 ■美少女露點貼圖 ■176影音視訊網 ■完美女人影音視訊網 ■影音live秀 ■辣妹影音視訊 聊天 ■色妹妹貼影片 區 ■免費視訊贈送點數 ■交友視訊網 ■辣妹妹影音視訊 ■777美女圖 ■影音美女視訊聊天網 ■色情片免費看 kiss ■武則天視訊聊天室 ■愛上女主播視訊聊天室 ■女人幫影音聊天室 ■免費觀看色情片 ■cok視訊聊天網 ■網路美女視訊 ■qk休閒網 ■卡通色情片 ■視訊情人百分百 ■比基尼辣妹圖片 mv ■ut影音交友聊天 網 ■視訊妹外約 ■免費A短片下載 ■
ReplyDelete高聊天室ut男同聊天同志聊天至聊天室uut男同志聊天av99洪爺影城av99影片亞洲av99影片金瓶梅影片av99影片洪爺avdvd168影片av女優線上免費看av女優論壇av免費情色短片av免費電影av免费电影av亞洲成人區av直播台av直播式av看影片av動畫卡通av專賣店av情色網站排行榜av情色影片免費觀賞av情圖貼av援交妹av免費區AV免費看短片av色貼圖av女優館av片直播辦公室偷情遊戲免費視訊聊天網ut聊天室聊天室
ReplyDelete日本美女寫真dvd ■色妹妹情愛影音網 ■美女寫真集 ■火辣淫妹視訊網 ■sex520免費影片 ■免費視訊聊天秀 ■台灣kiss色情貼圖 ■成人免費聊天 ■免費視訊妹 ■上班族聊天室F1 ■日本色情網站 ■視訊色妹妹 ■美女寫真集影片 ■視訊聊天交友網 ■免費視訊聊天區 ■173 視訊美女聊天 ■成人性站 ■金瓶梅影音視訊聊天室 ■台灣美女寫真集圖片館 ■免費情色視訊 ■免費視訊秀 ■美眉-交友視訊 ■成人片分享區 ■免費視訊辣妹聊天室 ■美女寫真集圖片 ■2009真情寫真 ■18成人色情小說網 ■免費視訊聊天網 ■日本美女寫真集 ■後宮視訊情色網 ■sex888影片分享區 ■後宮電影院 ■美女影片試看 ■火辣妹妹視訊網 ■173影音視訊live秀 ■我愛78論壇 ■免費視訊交友 ■成人片線上看 ■免費視訊秀視訊交友 ■日本免費視訊 ■
ReplyDeleteI do like ur article~!!!..................................................
ReplyDelete天下沒有走不通的路,沒有克服不了的困難,沒有打不敗的敵人。......................................................
ReplyDelete.有價值的東西,都要付出代價。- ..................................................
ReplyDeleteI do like ur article~!!!..................................................
ReplyDeleteblog不錯唷~我會常常來看的~加油~!! .........................
ReplyDelete感謝是愛心的第一步 ..................................................
ReplyDelete責人之心責己,恕己之心恕人。.............................................
ReplyDelete沒有友情,人生何樂?.............................................
ReplyDelete