declare [XMLParser] = {Module.link ['x-oz://system/xml/Parser.ozf']} proc {Main Data} Parser = {New XMLParser.parser init} [Doc] = {Parser parseVS(Data $)} FirstItem = {XPath Doc [inventory section item]}.1 Prices = {XPath Doc [inventory section item price Text]} Names = {XPath Doc [inventory section item name]} in {ForAll Prices System.showInfo} end %% %% Emulation of some XPath functionality: %% fun {XPath Doc Path} P|Pr = Path in Doc.name = P %% assert {FoldL Pr XPathStep [Doc]} end fun {XPathStep Elements P} if {IsProcedure P} then {Map Elements P} else {FilteredChildren Elements P} end end %% A flat list of all Type-children of all Elements. fun {FilteredChildren Elements Type} {Flatten {Map Elements fun {$ E} {Filter E.children fun {$ X} case X of element(name:!Type ...) then true else false end end} end}} end %% PCDATA of an element as a ByteString fun {Text Element} Texts = for Child in Element.children collect:C do case Child of text(data:BS ...) then {C BS} end end in {FoldR Texts ByteString.append {ByteString.make nil}} end Data = "" #"
" #" " #" Invisibility Cream" #" 14.50" #" Makes you invisible" #" " #" " #" Levitation Salve" #" 23.99" #" Levitate yourself for up to 3 hours per application" #" " #"
" #"
" #" " #" Blork and Freen Instameal" #" 4.95" #" A tasty meal in a tablet; just add water" #" " #" " #" Grob winglets" #" 3.56" #" Tender winglets of Grob. Just add water" #" " #"
" #"
" in {Main Data}