XMI2TXT

#!/usr/bin/tclsh8.4
# Pekka Järvinen 2006
# XMI2TXT TCL
# Creates list of classes with variables and methods
# usage: cat my_xmi_file.xmi | ./xmi2txt.tcl
#
# Example output:
# companyHandler:
#   V mixed $this->db
#   M void __construct (mixed $db)
#   M bool add (string $name, int$parentid)
#   M bool edit (int $id, string $name, int $parentid)
#   M array getList (array $notids)
#   M array getDetails (int $id)
#   M int getVisitsByCompany (int $company)
#
# V = variable M = method
# M <output> <method name> (<parameter type> <parameter name>)
# V <type> <name inside class>
#
# Tested with: Ubuntu Dapper Linux
# XMI file was created with http://tech.motion-twin.com/php_php2xmi.html
#
# This script was created because I wanted to print classes and methods easily 
# without too much info on paper
  
package require tdom
  
fconfigure stdin -buffering line
  
set packet "";
while {![eof stdin]} {
    append packet [gets stdin];
}
  
set doc [dom parse $packet];
set root [$doc documentElement];
  
set classData [$root selectNodes {descendant::UML:Class}];
  
foreach class $classData {
    foreach node $class {
  
      set attList [$node attributes *];
  
      foreach attribute $attList {
  
        if {[string tolower $attribute] == "name"} {
          set className [$node getAttribute $attribute];
          puts "$className:";
  
          set classVarData [$root selectNodes "descendant::UML:Class\[@name='$className'\]/UML:Classifier.feature/UML:Attribute"];
  
          foreach innerClass $classVarData {
            foreach innerNode $innerClass {
              set vName [$innerNode selectNodes "string(@name)"];
              set vType [$innerNode selectNodes "string(@type)"];
              puts "  V $vType \$this->$vName";
            }
          }
  
          set classInnerData [$root selectNodes "descendant::UML:Class\[@name='$className'\]/UML:Classifier.feature/UML:Operation"];
  
          foreach innerClass $classInnerData {
            foreach innerNode $innerClass {
              set mName [$innerNode selectNodes "string(@name)"];
              set mType [$innerNode selectNodes "string(@type)"];
  
              set methodData [$root selectNodes "descendant::UML:Class\[@name='$className'\]/UML:Classifier.feature/UML:Operation\[@name='$mName'\]/UML:BehavioralFeature.parameter/UML:Parameter"];
              set mParams {};
  
              foreach method $methodData {
                foreach methodNode $method {
                  set mParamType [$methodNode selectNodes "string(@type)"];
                  set mParam [$methodNode selectNodes "string(@name)"];
                  lappend mParams "$mParamType \$$mParam";
                }
              }
              
              puts "  M $mType $mName ([join $mParams ", "])";
  
            }
          }
  
          puts "";
          puts "";
  
        }
        
      }
      
    }
}