Richard Suchenwirth 2002-11-24 - Reading "XML in a Nutshell", I was happy to see Tcl mentioned at least in one place (though not in the index). Code examples in that book are mostly in Java. However, their example 19-3, where, on little more than two pages of code, an XML document statistics program based on SAX (Simple API for XML) (counting elements, attributes, processing instructions, text characters) is developed, prompted me to remake it in Tcl (on half a page of code, of course ;-) The code below uses the expat SAX parser delivered with tDOM, but should run with little modifications with TclXML's parser too.
2003-07-30: added a few lines to do by-element-name statistics - RS
#!/usr/bin/env tclsh package require tdom #--- Callbacks for certain parser events proc el {name attlist} { global g incr ::nEl incr ::nAtt [llength $attlist] incr g($name) } proc ch data { incr ::nChar [string length $data] } proc pi {target data} { incr ::nPi } #--- "main" loop if ![llength $argv] {puts "usage: $argv0 file..."} foreach file $argv { foreach i {nEl nAtt nChar nPi} {set $i 0} ;# reset counters set p [expat -elementstartcommand el \ -characterdatacommand ch \ -processinginstructioncommand pi ] if [catch {$p parsefile $file} res] { puts "error:$res" } else { puts "$file:\n$nEl elements, $nAtt attributes, $nChar characters,\ $nPi processing instructions" foreach name [lsort [array names g]] { puts [format %-20s%7d $name $g($name)] } } $p free }