1*8462SApril.Chin@Sun.COM#!/usr/bin/ksh93 2*8462SApril.Chin@Sun.COM 3*8462SApril.Chin@Sun.COM# 4*8462SApril.Chin@Sun.COM# CDDL HEADER START 5*8462SApril.Chin@Sun.COM# 6*8462SApril.Chin@Sun.COM# The contents of this file are subject to the terms of the 7*8462SApril.Chin@Sun.COM# Common Development and Distribution License (the "License"). 8*8462SApril.Chin@Sun.COM# You may not use this file except in compliance with the License. 9*8462SApril.Chin@Sun.COM# 10*8462SApril.Chin@Sun.COM# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 11*8462SApril.Chin@Sun.COM# or http://www.opensolaris.org/os/licensing. 12*8462SApril.Chin@Sun.COM# See the License for the specific language governing permissions 13*8462SApril.Chin@Sun.COM# and limitations under the License. 14*8462SApril.Chin@Sun.COM# 15*8462SApril.Chin@Sun.COM# When distributing Covered Code, include this CDDL HEADER in each 16*8462SApril.Chin@Sun.COM# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 17*8462SApril.Chin@Sun.COM# If applicable, add the following below this CDDL HEADER, with the 18*8462SApril.Chin@Sun.COM# fields enclosed by brackets "[]" replaced with your own identifying 19*8462SApril.Chin@Sun.COM# information: Portions Copyright [yyyy] [name of copyright owner] 20*8462SApril.Chin@Sun.COM# 21*8462SApril.Chin@Sun.COM# CDDL HEADER END 22*8462SApril.Chin@Sun.COM# 23*8462SApril.Chin@Sun.COM 24*8462SApril.Chin@Sun.COM# 25*8462SApril.Chin@Sun.COM# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 26*8462SApril.Chin@Sun.COM# Use is subject to license terms. 27*8462SApril.Chin@Sun.COM# 28*8462SApril.Chin@Sun.COM 29*8462SApril.Chin@Sun.COM# Solaris needs /usr/xpg6/bin:/usr/xpg4/bin because the tools in /usr/bin are not POSIX-conformant 30*8462SApril.Chin@Sun.COMexport PATH=/usr/xpg6/bin:/usr/xpg4/bin:/bin:/usr/bin 31*8462SApril.Chin@Sun.COM 32*8462SApril.Chin@Sun.COMfunction fatal_error 33*8462SApril.Chin@Sun.COM{ 34*8462SApril.Chin@Sun.COM print -u 2 "${progname}: $*" 35*8462SApril.Chin@Sun.COM exit 1 36*8462SApril.Chin@Sun.COM} 37*8462SApril.Chin@Sun.COM 38*8462SApril.Chin@Sun.COMfunction attrstrtoattrarray 39*8462SApril.Chin@Sun.COM{ 40*8462SApril.Chin@Sun.COM#set -o xtrace 41*8462SApril.Chin@Sun.COM typeset s="$1" 42*8462SApril.Chin@Sun.COM nameref aa=$2 # attribute array 43*8462SApril.Chin@Sun.COM integer aa_count=0 44*8462SApril.Chin@Sun.COM integer aa_count=0 45*8462SApril.Chin@Sun.COM typeset nextattr 46*8462SApril.Chin@Sun.COM integer currattrlen=0 47*8462SApril.Chin@Sun.COM typeset tagstr 48*8462SApril.Chin@Sun.COM typeset tagval 49*8462SApril.Chin@Sun.COM 50*8462SApril.Chin@Sun.COM while (( ${#s} > 0 )) ; do 51*8462SApril.Chin@Sun.COM # skip whitespaces 52*8462SApril.Chin@Sun.COM while [[ "${s:currattrlen:1}" == ~(E)[[:blank:][:space:]] ]] ; do 53*8462SApril.Chin@Sun.COM (( currattrlen++ )) 54*8462SApril.Chin@Sun.COM done 55*8462SApril.Chin@Sun.COM s="${s:currattrlen:${#s}}" 56*8462SApril.Chin@Sun.COM 57*8462SApril.Chin@Sun.COM # anything left ? 58*8462SApril.Chin@Sun.COM (( ${#s} == 0 )) && break 59*8462SApril.Chin@Sun.COM 60*8462SApril.Chin@Sun.COM # Pattern tests: 61*8462SApril.Chin@Sun.COM #x="foo=bar huz=123" ; print "${x##~(E)[[:alnum:]_-:]*=[^[:blank:]\"]*}" 62*8462SApril.Chin@Sun.COM #x='foo="ba=r o" huz=123' ; print "${x##~(E)[[:alnum:]_-:]*=\"[^\"]*\"}" 63*8462SApril.Chin@Sun.COM #x="foo='ba=r o' huz=123" ; print "${x##~(E)[[:alnum:]_-:]*=\'[^\"]*\'}" 64*8462SApril.Chin@Sun.COM #x="foox huz=123" ; print "${x##~(E)[[:alnum:]_-:]*}" 65*8462SApril.Chin@Sun.COM # All pattern combined via eregex (w|x|y|z): 66*8462SApril.Chin@Sun.COM #x='foo="bar=o" huz=123' ; print "${x##~(E)([[:alnum:]_-:]*=[^[:blank:]\"]*|[[:alnum:]_-:]*=\"[^\"]*\"|[[:alnum:]_-:]*=\'[^\"]*\')}" 67*8462SApril.Chin@Sun.COM nextattr="${s##~(E)([[:alnum:]_-:]*=[^[:blank:]\"]*|[[:alnum:]_-:]*=\"[^\"]*\"|[[:alnum:]_-:]*=\'[^\"]*\'|[[:alnum:]_-:]*)}" 68*8462SApril.Chin@Sun.COM currattrlen=$(( ${#s} - ${#nextattr})) 69*8462SApril.Chin@Sun.COM 70*8462SApril.Chin@Sun.COM # add entry 71*8462SApril.Chin@Sun.COM tagstr="${s:0:currattrlen}" 72*8462SApril.Chin@Sun.COM if [[ "${tagstr}" == *=* ]] ; then 73*8462SApril.Chin@Sun.COM # normal case: attribute with value 74*8462SApril.Chin@Sun.COM 75*8462SApril.Chin@Sun.COM tagval="${tagstr#*=}" 76*8462SApril.Chin@Sun.COM 77*8462SApril.Chin@Sun.COM # strip quotes ('' or "") 78*8462SApril.Chin@Sun.COM if [[ "${tagval}" == ~(Elr)(\'.*\'|\".*\") ]] ; then 79*8462SApril.Chin@Sun.COM tagval="${tagval:1:${#tagval}-2}" 80*8462SApril.Chin@Sun.COM fi 81*8462SApril.Chin@Sun.COM 82*8462SApril.Chin@Sun.COM aa[${aa_count}]=( name="${tagstr%%=*}" value="${tagval}" ) 83*8462SApril.Chin@Sun.COM else 84*8462SApril.Chin@Sun.COM # special case for HTML where you have something like <foo baz> 85*8462SApril.Chin@Sun.COM aa[${aa_count}]=( name="${tagstr}" ) 86*8462SApril.Chin@Sun.COM fi 87*8462SApril.Chin@Sun.COM (( aa_count++ )) 88*8462SApril.Chin@Sun.COM (( aa_count > 1000 )) && fatal_error "$0: aa_count too large" # assert 89*8462SApril.Chin@Sun.COM done 90*8462SApril.Chin@Sun.COM} 91*8462SApril.Chin@Sun.COM 92*8462SApril.Chin@Sun.COM 93*8462SApril.Chin@Sun.COMfunction handle_document 94*8462SApril.Chin@Sun.COM{ 95*8462SApril.Chin@Sun.COM#set -o xtrace 96*8462SApril.Chin@Sun.COM nameref callbacks=${1} 97*8462SApril.Chin@Sun.COM typeset tag_type="${2}" 98*8462SApril.Chin@Sun.COM typeset tag_value="${3}" 99*8462SApril.Chin@Sun.COM typeset tag_attributes="${4}" 100*8462SApril.Chin@Sun.COM nameref doc=${callbacks["arg_tree"]} 101*8462SApril.Chin@Sun.COM nameref nodepath="${stack.items[stack.pos]}" 102*8462SApril.Chin@Sun.COM nameref nodesnum="${stack.items[stack.pos]}num" 103*8462SApril.Chin@Sun.COM 104*8462SApril.Chin@Sun.COM case "${tag_type}" in 105*8462SApril.Chin@Sun.COM tag_begin) 106*8462SApril.Chin@Sun.COM nodepath[${nodesnum}]+=( 107*8462SApril.Chin@Sun.COM typeset tagtype="element" 108*8462SApril.Chin@Sun.COM typeset tagname="${tag_value}" 109*8462SApril.Chin@Sun.COM typeset -A tagattributes=( ) 110*8462SApril.Chin@Sun.COM typeset -A nodes=( ) 111*8462SApril.Chin@Sun.COM integer nodesnum=0 112*8462SApril.Chin@Sun.COM ) 113*8462SApril.Chin@Sun.COM 114*8462SApril.Chin@Sun.COM # fill attributes 115*8462SApril.Chin@Sun.COM if [[ "${tag_attributes}" != "" ]] ; then 116*8462SApril.Chin@Sun.COM attrstrtoattrarray "${tag_attributes}" "nodepath[${nodesnum}].tagattributes" 117*8462SApril.Chin@Sun.COM fi 118*8462SApril.Chin@Sun.COM 119*8462SApril.Chin@Sun.COM (( stack.pos++ )) 120*8462SApril.Chin@Sun.COM stack.items[stack.pos]="${stack.items[stack.pos-1]}[${nodesnum}].nodes" 121*8462SApril.Chin@Sun.COM (( nodesnum++ )) 122*8462SApril.Chin@Sun.COM ;; 123*8462SApril.Chin@Sun.COM tag_end) 124*8462SApril.Chin@Sun.COM (( stack.pos-- )) 125*8462SApril.Chin@Sun.COM ;; 126*8462SApril.Chin@Sun.COM tag_text) 127*8462SApril.Chin@Sun.COM nodepath[${nodesnum}]+=( 128*8462SApril.Chin@Sun.COM typeset tagtype="text" 129*8462SApril.Chin@Sun.COM typeset tagvalue="${tag_value}" 130*8462SApril.Chin@Sun.COM ) 131*8462SApril.Chin@Sun.COM (( nodesnum++ )) 132*8462SApril.Chin@Sun.COM ;; 133*8462SApril.Chin@Sun.COM tag_comment) 134*8462SApril.Chin@Sun.COM nodepath[${nodesnum}]+=( 135*8462SApril.Chin@Sun.COM typeset tagtype="comment" 136*8462SApril.Chin@Sun.COM typeset tagvalue="${tag_value}" 137*8462SApril.Chin@Sun.COM ) 138*8462SApril.Chin@Sun.COM (( nodesnum++ )) 139*8462SApril.Chin@Sun.COM ;; 140*8462SApril.Chin@Sun.COM document_start) 141*8462SApril.Chin@Sun.COM ;; 142*8462SApril.Chin@Sun.COM document_end) 143*8462SApril.Chin@Sun.COM ;; 144*8462SApril.Chin@Sun.COM esac 145*8462SApril.Chin@Sun.COM 146*8462SApril.Chin@Sun.COM# print "xmltok: '${tag_type}' = '${tag_value}'" 147*8462SApril.Chin@Sun.COM} 148*8462SApril.Chin@Sun.COM 149*8462SApril.Chin@Sun.COMfunction xml_tok 150*8462SApril.Chin@Sun.COM{ 151*8462SApril.Chin@Sun.COM typeset buf="" 152*8462SApril.Chin@Sun.COM typeset namebuf="" 153*8462SApril.Chin@Sun.COM typeset attrbuf="" 154*8462SApril.Chin@Sun.COM typeset c="" 155*8462SApril.Chin@Sun.COM typeset isendtag # bool: true/false 156*8462SApril.Chin@Sun.COM typeset issingletag # bool: true/false (used for tags like "<br />") 157*8462SApril.Chin@Sun.COM nameref callbacks=${1} 158*8462SApril.Chin@Sun.COM 159*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["document_start"]}" ]] && ${callbacks["document_start"]} "${1}" "document_start" 160*8462SApril.Chin@Sun.COM 161*8462SApril.Chin@Sun.COM while IFS='' read -r -N 1 c ; do 162*8462SApril.Chin@Sun.COM isendtag=false 163*8462SApril.Chin@Sun.COM 164*8462SApril.Chin@Sun.COM if [[ "$c" == "<" ]] ; then 165*8462SApril.Chin@Sun.COM # flush any text content 166*8462SApril.Chin@Sun.COM if [[ "$buf" != "" ]] ; then 167*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["tag_text"]}" ]] && ${callbacks["tag_text"]} "${1}" "tag_text" "$buf" 168*8462SApril.Chin@Sun.COM buf="" 169*8462SApril.Chin@Sun.COM fi 170*8462SApril.Chin@Sun.COM 171*8462SApril.Chin@Sun.COM IFS='' read -r -N 1 c 172*8462SApril.Chin@Sun.COM if [[ "$c" == "/" ]] ; then 173*8462SApril.Chin@Sun.COM isendtag=true 174*8462SApril.Chin@Sun.COM else 175*8462SApril.Chin@Sun.COM buf="$c" 176*8462SApril.Chin@Sun.COM fi 177*8462SApril.Chin@Sun.COM IFS='' read -r -d '>' c 178*8462SApril.Chin@Sun.COM buf+="$c" 179*8462SApril.Chin@Sun.COM 180*8462SApril.Chin@Sun.COM # handle comments 181*8462SApril.Chin@Sun.COM if [[ "$buf" == ~(El)!-- ]] ; then 182*8462SApril.Chin@Sun.COM # did we read the comment completely ? 183*8462SApril.Chin@Sun.COM if [[ "$buf" != ~(Elr)!--.*-- ]] ; then 184*8462SApril.Chin@Sun.COM buf+=">" 185*8462SApril.Chin@Sun.COM while [[ "$buf" != ~(Elr)!--.*-- ]] ; do 186*8462SApril.Chin@Sun.COM IFS='' read -r -N 1 c || break 187*8462SApril.Chin@Sun.COM buf+="$c" 188*8462SApril.Chin@Sun.COM done 189*8462SApril.Chin@Sun.COM fi 190*8462SApril.Chin@Sun.COM 191*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["tag_comment"]}" ]] && ${callbacks["tag_comment"]} "${1}" "tag_comment" "${buf:3:${#buf}-5}" 192*8462SApril.Chin@Sun.COM buf="" 193*8462SApril.Chin@Sun.COM continue 194*8462SApril.Chin@Sun.COM fi 195*8462SApril.Chin@Sun.COM 196*8462SApril.Chin@Sun.COM # check if the tag starts and ends at the same time (like "<br />") 197*8462SApril.Chin@Sun.COM if [[ "${buf}" == ~(Er).*/ ]] ; then 198*8462SApril.Chin@Sun.COM issingletag=true 199*8462SApril.Chin@Sun.COM buf="${buf%*/}" 200*8462SApril.Chin@Sun.COM else 201*8462SApril.Chin@Sun.COM issingletag=false 202*8462SApril.Chin@Sun.COM fi 203*8462SApril.Chin@Sun.COM 204*8462SApril.Chin@Sun.COM # check if the tag has attributes (e.g. space after name) 205*8462SApril.Chin@Sun.COM if [[ "$buf" == ~(E)[[:space:][:blank:]] ]] ; then 206*8462SApril.Chin@Sun.COM namebuf="${buf%%~(E)[[:space:][:blank:]].*}" 207*8462SApril.Chin@Sun.COM attrbuf="${buf#~(E).*[[:space:][:blank:]]}" 208*8462SApril.Chin@Sun.COM else 209*8462SApril.Chin@Sun.COM namebuf="$buf" 210*8462SApril.Chin@Sun.COM attrbuf="" 211*8462SApril.Chin@Sun.COM fi 212*8462SApril.Chin@Sun.COM 213*8462SApril.Chin@Sun.COM if ${isendtag} ; then 214*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["tag_end"]}" ]] && ${callbacks["tag_end"]} "${1}" "tag_end" "$namebuf" 215*8462SApril.Chin@Sun.COM else 216*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["tag_begin"]}" ]] && ${callbacks["tag_begin"]} "${1}" "tag_begin" "$namebuf" "$attrbuf" 217*8462SApril.Chin@Sun.COM 218*8462SApril.Chin@Sun.COM # handle tags like <br/> (which are start- and end-tag in one piece) 219*8462SApril.Chin@Sun.COM if ${issingletag} ; then 220*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["tag_end"]}" ]] && ${callbacks["tag_end"]} "${1}" "tag_end" "$namebuf" 221*8462SApril.Chin@Sun.COM fi 222*8462SApril.Chin@Sun.COM fi 223*8462SApril.Chin@Sun.COM buf="" 224*8462SApril.Chin@Sun.COM else 225*8462SApril.Chin@Sun.COM buf+="$c" 226*8462SApril.Chin@Sun.COM fi 227*8462SApril.Chin@Sun.COM done 228*8462SApril.Chin@Sun.COM 229*8462SApril.Chin@Sun.COM [[ ! -z "${callbacks["document_end"]}" ]] && ${callbacks["document_end"]} "${1}" "document_end" "exit_success" 230*8462SApril.Chin@Sun.COM 231*8462SApril.Chin@Sun.COM print # final newline to make filters like "sed" happy 232*8462SApril.Chin@Sun.COM} 233*8462SApril.Chin@Sun.COM 234*8462SApril.Chin@Sun.COMfunction print_sample1_xml 235*8462SApril.Chin@Sun.COM{ 236*8462SApril.Chin@Sun.COMcat <<EOF 237*8462SApril.Chin@Sun.COM<br /> 238*8462SApril.Chin@Sun.COM<score-partwise instrument="flute1"> 239*8462SApril.Chin@Sun.COM <identification> 240*8462SApril.Chin@Sun.COM <kaiman>nocrocodile</kaiman> 241*8462SApril.Chin@Sun.COM </identification> 242*8462SApril.Chin@Sun.COM <!-- a comment --> 243*8462SApril.Chin@Sun.COM <partlist> 244*8462SApril.Chin@Sun.COM <foo>myfootext</foo> 245*8462SApril.Chin@Sun.COM <bar>mybartext</bar> 246*8462SApril.Chin@Sun.COM <snap /> 247*8462SApril.Chin@Sun.COM <!-- another 248*8462SApril.Chin@Sun.COM comment --> 249*8462SApril.Chin@Sun.COM <ttt>myttttext</ttt> 250*8462SApril.Chin@Sun.COM </partlist> 251*8462SApril.Chin@Sun.COM</score-partwise> 252*8462SApril.Chin@Sun.COMEOF 253*8462SApril.Chin@Sun.COM} 254*8462SApril.Chin@Sun.COM 255*8462SApril.Chin@Sun.COMfunction usage 256*8462SApril.Chin@Sun.COM{ 257*8462SApril.Chin@Sun.COM OPTIND=0 258*8462SApril.Chin@Sun.COM getopts -a "${progname}" "${xmldocumenttree1_usage}" OPT '-?' 259*8462SApril.Chin@Sun.COM exit 2 260*8462SApril.Chin@Sun.COM} 261*8462SApril.Chin@Sun.COM 262*8462SApril.Chin@Sun.COM# program start 263*8462SApril.Chin@Sun.COMbuiltin basename 264*8462SApril.Chin@Sun.COMbuiltin cat 265*8462SApril.Chin@Sun.COMbuiltin date 266*8462SApril.Chin@Sun.COMbuiltin uname 267*8462SApril.Chin@Sun.COM 268*8462SApril.Chin@Sun.COMtypeset progname="${ basename "${0}" ; }" 269*8462SApril.Chin@Sun.COM 270*8462SApril.Chin@Sun.COMtypeset -r xmldocumenttree1_usage=$'+ 271*8462SApril.Chin@Sun.COM[-?\n@(#)\$Id: xmldocumenttree1 (Roland Mainz) 2008-10-14 \$\n] 272*8462SApril.Chin@Sun.COM[-author?Roland Mainz <roland.mainz@nrubsig.org>] 273*8462SApril.Chin@Sun.COM[+NAME?xmldocumenttree1 - XML tree demo] 274*8462SApril.Chin@Sun.COM[+DESCRIPTION?\bxmldocumenttree\b is a small ksh93 compound variable demo 275*8462SApril.Chin@Sun.COM which reads a XML input file, converts it into an internal 276*8462SApril.Chin@Sun.COM variable tree representation and outputs it in the format 277*8462SApril.Chin@Sun.COM specified by viewmode (either "list", "namelist" or "tree").] 278*8462SApril.Chin@Sun.COM 279*8462SApril.Chin@Sun.COMfile viewmode 280*8462SApril.Chin@Sun.COM 281*8462SApril.Chin@Sun.COM[+SEE ALSO?\bksh93\b(1)] 282*8462SApril.Chin@Sun.COM' 283*8462SApril.Chin@Sun.COM 284*8462SApril.Chin@Sun.COMwhile getopts -a "${progname}" "${xmldocumenttree1_usage}" OPT ; do 285*8462SApril.Chin@Sun.COM# printmsg "## OPT=|${OPT}|, OPTARG=|${OPTARG}|" 286*8462SApril.Chin@Sun.COM case ${OPT} in 287*8462SApril.Chin@Sun.COM *) usage ;; 288*8462SApril.Chin@Sun.COM esac 289*8462SApril.Chin@Sun.COMdone 290*8462SApril.Chin@Sun.COMshift $((OPTIND-1)) 291*8462SApril.Chin@Sun.COM 292*8462SApril.Chin@Sun.COMtypeset xmlfile="$1" 293*8462SApril.Chin@Sun.COMtypeset viewmode="$2" 294*8462SApril.Chin@Sun.COM 295*8462SApril.Chin@Sun.COMif [[ "${xmlfile}" == "" ]] ; then 296*8462SApril.Chin@Sun.COM fatal_error $"No file given." 297*8462SApril.Chin@Sun.COMfi 298*8462SApril.Chin@Sun.COM 299*8462SApril.Chin@Sun.COMif [[ "${viewmode}" != ~(Elr)(list|namelist|tree) ]] ; then 300*8462SApril.Chin@Sun.COM fatal_error $"Invalid view mode \"${viewmode}\"." 301*8462SApril.Chin@Sun.COMfi 302*8462SApril.Chin@Sun.COM 303*8462SApril.Chin@Sun.COMtypeset -C xdoc 304*8462SApril.Chin@Sun.COMtypeset -A xdoc.nodes 305*8462SApril.Chin@Sun.COMinteger xdoc.nodesnum=0 306*8462SApril.Chin@Sun.COM 307*8462SApril.Chin@Sun.COMtypeset -C stack 308*8462SApril.Chin@Sun.COMtypeset -a stack.items=( [0]="doc.nodes" ) 309*8462SApril.Chin@Sun.COMinteger stack.pos=0 310*8462SApril.Chin@Sun.COM 311*8462SApril.Chin@Sun.COM# setup callbacks for xml_tok 312*8462SApril.Chin@Sun.COMtypeset -A document_cb # callbacks for xml_tok 313*8462SApril.Chin@Sun.COMdocument_cb["document_start"]="handle_document" 314*8462SApril.Chin@Sun.COMdocument_cb["document_end"]="handle_document" 315*8462SApril.Chin@Sun.COMdocument_cb["tag_begin"]="handle_document" 316*8462SApril.Chin@Sun.COMdocument_cb["tag_end"]="handle_document" 317*8462SApril.Chin@Sun.COMdocument_cb["tag_text"]="handle_document" 318*8462SApril.Chin@Sun.COMdocument_cb["tag_comment"]="handle_document" 319*8462SApril.Chin@Sun.COM# argument for "handle_document" 320*8462SApril.Chin@Sun.COMdocument_cb["arg_tree"]="xdoc" 321*8462SApril.Chin@Sun.COM 322*8462SApril.Chin@Sun.COM 323*8462SApril.Chin@Sun.COMif [[ "${xmlfile}" == "#sample1" ]] ; then 324*8462SApril.Chin@Sun.COM print_sample1_xml | xml_tok document_cb 325*8462SApril.Chin@Sun.COMelif [[ "${xmlfile}" == "#sample2" ]] ; then 326*8462SApril.Chin@Sun.COM /usr/sfw/bin/wget \ 327*8462SApril.Chin@Sun.COM --user-agent='ksh93_xmldocumenttree' \ 328*8462SApril.Chin@Sun.COM --output-document=- \ 329*8462SApril.Chin@Sun.COM 'http://www.google.com/custom?q=gummi+bears' | 330*8462SApril.Chin@Sun.COM /usr/bin/iconv -f "ISO8859-1" | 331*8462SApril.Chin@Sun.COM xml_tok document_cb 332*8462SApril.Chin@Sun.COMelse 333*8462SApril.Chin@Sun.COM cat "${xmlfile}" | xml_tok document_cb 334*8462SApril.Chin@Sun.COMfi 335*8462SApril.Chin@Sun.COM 336*8462SApril.Chin@Sun.COMprint -u2 "#parsing completed." 337*8462SApril.Chin@Sun.COM 338*8462SApril.Chin@Sun.COMcase "${viewmode}" in 339*8462SApril.Chin@Sun.COM list) 340*8462SApril.Chin@Sun.COM set | egrep "xdoc.*(tagname|tagtype|tagval|tagattributes)" | fgrep -v ']=$' 341*8462SApril.Chin@Sun.COM ;; 342*8462SApril.Chin@Sun.COM namelist) 343*8462SApril.Chin@Sun.COM typeset + | egrep "xdoc.*(tagname|tagtype|tagval|tagattributes)" 344*8462SApril.Chin@Sun.COM ;; 345*8462SApril.Chin@Sun.COM tree) 346*8462SApril.Chin@Sun.COM print -- "${xdoc}" 347*8462SApril.Chin@Sun.COM ;; 348*8462SApril.Chin@Sun.COM *) 349*8462SApril.Chin@Sun.COM fatal_error $"Invalid view mode \"${viewmode}\"." 350*8462SApril.Chin@Sun.COM ;; 351*8462SApril.Chin@Sun.COMesac 352*8462SApril.Chin@Sun.COM 353*8462SApril.Chin@Sun.COMprint -u2 "#done." 354*8462SApril.Chin@Sun.COM 355*8462SApril.Chin@Sun.COMexit 0 356*8462SApril.Chin@Sun.COM# EOF. 357