Version 6 of XML Clean-Up

Updated 2012-07-01 05:27:21 by RLE

I was working with "xmlgen-1.4" and had quite a bit of success with it.

However, formatting of the results seemed to be a real pain, and the documentation, examples, disucssion thread, direct discussions with the originator of xmlgen did not seem to help me grasp the issues. From what I could tell, others in the community were having similar issues.

So to get my job done, I wrote the following routine. (Don't laugh - it could be better, but time has not been on my side.)

The following code does a very nice job of structuring resulting XML. I hope you find it as useful as I have.


The proc "CleanUP" needs the string of XML that will be cleaned up as the submission variable. This application generates a textbox to display the results.

    ### XML CLEANUP ROUTINES
    
    proc placeData {indentlevel item} {
                set tabs ""
                set i 1
                while {$i <= $indentlevel} {
                        lappend tabs "\t"
                        incr i
                }
                if {[llength $item] > 0 } {
                        # Write data to the non-visible textbox
                        .tb2 insert end "[join $tabs]$item\n"
                }
    } ; # end placeData
    
    
    proc CleanUp {xml} {
        catch {destroy .tb2}
        text .tb2
        
        # Gather XML Content
        set indentlevel 0
        foreach item [split $xml \n] {
                set item [string trim $item]
                switch -glob -- $item {
                        <?xml* {
                                # Header -- NO indent Adjustment
                                placeData $indentlevel $item
                        }
                        */> {
                                # Handle NULL Value Tags
                        }
                        </* {
                                # End Tag
                                incr indentlevel -1
                                placeData $indentlevel $item
                        }
                        <* {
                                # Look for tags on the same line verses start of a XML nest structure
                                # Get the tag name
                                regsub -all {<|>} $item { } tempitem
                                set tag [lindex $tempitem 0]
                                if [string match *</$tag> $item] {
                                        # In-Line Tag - NO indent Adjustment
                                        placeData $indentlevel $item
                                } else {
                                        # Tag is head of a super structure
                                        placeData $indentlevel $item
                                        incr indentlevel
                                }
                        }
                } ; # end switch
        } ; # end foreach
        return [.tb2 get 0.0 end]
    } ; # end CleanUp

In the future, I would like to add more controls to toggle between tab indentions verses spaces. And also possibly eliminate the second process and keep it all in one proc.

Hope you get as much benefit from this as I have.

David Bigelow