2010-04-09 14 views
2

Utilisation tdom, je voudrais faire défiler une liste d'objets dans le format suivant:TCL tdom: Looping par objets

<object> 
     <type>Hardware</type> 
     <name>System Name</name> 
     <description>Basic Description of System.</description> 
     <attributes> 
      <vendor>Dell</vendor> 
      <contract>MM/DD/YY</contract> 
      <supportExpiration>MM/DD/YY</supportExpiration> 
      <location>Building 123</location> 
      <serial>xxx-xxx-xxxx</serial> 
      <mac>some-mac-address</mac> 
     </attributes> 
    </object> 

    <object> 
     <type>Software</type> 
     <name>Second Object</name> 
    ... 

Puis-je utiliser tdom pour faire une liste d'objets:

set dom [dom parse $xml] 
set doc [$dom documentElement] 

set nodeList [$doc selectNodes /systems/object] 

Jusqu'à présent, j'ai fait cela pour (théoriquement) sélectionner chaque nœud "Objet" de la liste. Comment puis-je les boucler? Est-ce juste:

foreach node $nodeList { 

Pour chaque objet, j'ai besoin de récupérer l'association de chaque attribut. De l'exemple, je dois me rappeler que le "nom" est "Nom du système", "fournisseur" est "Dell", etc.

Je suis nouveau à TCL mais dans d'autres langues j'utiliserais un objet ou un liste associative pour stocker ceux-ci. Est-ce possible? Pouvez-vous me montrer un exemple de la syntaxe pour sélectionner un attribut de cette manière?

Répondre

1

Vous êtes en effet sur la bonne voie. Vous voulez probablement faire ceci:

foreach node [$doc selectNodes "/systems/object"] { 
    set name [[$node selectNodes "./name\[1\]"] text] 
    lappend listOfNames $name 
    foreach attr {vendor serial} { 
     set aNodes [$node selectNodes "./attributes/$attr"] 
     if {[llength $aNodes]} { 
      set data($name,$attr) [[lindex $aNodes 0] text] 
     } 
    } 
} 

J'utilise les capacités de tableau (associatif) de Tcl pour contenir les attributs extraits. Il y a d'autres manières qui fonctionneront également, par exemple, un objet iTcl ou XOTcl ou TclOO, ou un dictionnaire, ou un nombre quelconque d'autres possibilités. Rappelez-vous, je serais en fait tenté de garder le document lui-même et de le traiter directement, étant donné qu'il est facile de travailler avec tDOM; pas besoin d'extraire tout dans une autre structure de données juste pour le diable.

+0

Merci pour votre aide, c'est exactement ce que je avais besoin. Vous avez raison, je ferai probablement mieux d'utiliser chaque attribut directement à partir de tDOM. Ma prochaine aventure consiste à construire chaque objet analysé en objet de base de données. Amusement :-) – pws5068

+0

La chose principale est de planifier * exactement * ce que vous voulez réaliser, quelles pièces devraient aller où, etc. Je trouve que le dos d'une enveloppe est un bon endroit pour faire ces plans. :-) –

0
set doc [$dom documentElement] 
set nodeList [$doc selectNodes /systems/object] 

foreach node [$nodeList childNodes] { 
    set nodename [$node nodeName] 
    if {$nodename eq "attributes"} { 
     foreach attr_node [$node childNodes] { 
      set attr_nodename [$attr_node nodeName] 
      set attr_nodetext [[$attr_node selectNodes text()] nodeValue] 
      puts "$attr_nodename : $attr_nodetext" 
     } 
    } else { 
     set node_text [[$node selectNodes text()] nodeValue] 
     puts "$nodename : $node_text" 
    } 
} 

Check this out pour la référence rapide https://tdom.github.io/domDoc.html