Pour parser du XML, j'utilise tDOM qui provient de http://www.tdom.org
Références sur le Wiki anglophone : http://wiki.tcl.tk/2?tDOM
Par rapport à TclDOM, référencé dans Utiliser XML et XSLT,
Rudiments d'utilisation pour explorer du XML, qui contiendrait des balises <categorie> et <maproc>.
Dans cet exemple, j'encapsule du code Tcl à l'intérieur d'une section CDATA.
# exploration (parse) de code XML avec tDOM
# exemple employant des balises simples et une section CDATA
# procédure récursive d'exploration
proc xml_explore { node {lvl 0} {hierlist {}} } {
set type [$node nodeType]
set name [$node nodeName]
set value [$node nodeValue]
if {$type != "ELEMENT_NODE" } then {
return
}
switch $name {
"categorie" {
xml_parsecategorie $node
}
"maproc" {
xml_parsemaproc $node
}
}
# conserver la hiérarchie des noeuds (utile pour faire proc de debug contextuel)
set nodehierlist [concat $name $hierlist]
foreach child [$node childNodes] {
xml_explore $child [expr {$lvl+1}] $nodehierlist
}
}
# procédure pour parser categorie qui aurait un attribut id et un attribut param
proc xml_parsecategorie { node } {
set monid [$node getAttribute id]
set monparam [$node getAttribute param]
puts "voici une balise categorie avec id = $monid et param = $monparam"
}
# procédure pour parser maproc qui contiendrait un attribut clause
# et encapsulerait un élément CDATA (texte à prendre tel que, sans
# analyse)
proc xml_parsemaproc { node } {
set clause [$node getAttribute clause]
if { $clause == "tcltext" } {
set tcltext [[$node firstChild] nodeValue]
puts "voici du code tcl, affichons le..."
puts stdout "tcltext: $tcltext"
puts stdout "évaluons le ..."
eval $tcltext
}
}
package require tdom
set schematext {<?xml version="1.0" encoding="ISO-8859-1"?>
<categorie id="premiere" param="grand">
<maproc clause="tcltext">
<![CDATA[
for { set i 1 } { $i < 100 } { incr i } {
puts stdout "i: $i"
}
puts stdout "et voilà le travail"
]]>
</maproc>
</categorie>
}
set xmldoc [dom parse $schematext]
set xmlroot [$xmldoc documentElement]
xml_explore $xmlroot
$xmldoc deleteDans la série "vite fait bien fait", je colle une intervention de RS sur c.l.t.:
[/tmp]669:cat > test.xml
<names><name>Peter</name><name>Paul</name><name>Mary</name></names>
[/tmp]670:tclsh
% package req tdom
0.8.0
% xml::parser p -characterdatacommand chardata
p
% proc chardata string {puts $string}
% p parsefile test.xml
Peter
Paul
Mary
%Voir également Transformation basique de XML en liste Tcl avec tdom.