treeSerializer.js
 
/* tostring.js */

/**
* Returns a string of Json that represents the tree
* @param {Function} (optional) A function, which when passed the node, returns true or false to include
* or exclude the node.
* @param {Function} (optional) A function, which when passed an attribute name, and an attribute value,
* returns true or false to include or exclude the attribute.
* @return {String}
*/

Ext.tree.TreePanel.prototype.toJsonString = function(nodeFilter, attributeFilter, attributeMapping){
            return this.getRootNode().toJsonString(nodeFilter, attributeFilter, attributeMapping);
};

/**
* Returns a string of Json that represents the node
* @param {Function} (optional) A function, which when passed the node, returns true or false to include
* or exclude the node.
* @param {Function} (optional) A function, which when passed an attribute name, and an attribute value,
* returns true or false to include or exclude the attribute.
* @return {String}
*/

Ext.tree.TreeNode.prototype.toJsonString = function(nodeFilter, attributeFilter, attributeMapping){
//  Exclude nodes based on caller-supplied filtering function
        if (nodeFilter && (nodeFilter(this) == false)) {
                return '';
        }
        var c = false, result = "{";

//  Add the id attribute unless the attribute filter rejects it.
        if (!attributeFilter || attributeFilter("id", this.id)) {
                result += '"id:"' + this.id;
                c = true;
        }

//  Add all user-added attributes unless rejected by the attributeFilter.
        for(var key in this.attributes) {
                if ((key != 'id') && (!attributeFilter || attributeFilter(key, this.attributes[key]))) {
                 if (c) result += ',';
      if (attributeMapping && attributeMapping[key]) {
        thisKey = attributeMapping[key];
      } else {
        thisKey = key;
      }
                 result += '"' + thisKey + '":"' + this.attributes[key] + '"';
                 c = true;
         }
        }

//  Add child nodes if any
        var children = this.childNodes;
        var clen = children.length;
        if(clen != 0){
                if (c) result += ',';
                result += '"children":[';
                for(var i = 0; i < clen; i++){
                        if (i > 0) result += ',';
                        result += children[i].toJsonString(nodeFilter, attributeFilter, attributeMapping);
                }
                result += ']';
        }
        return result + "}";
};

/**
* Returns a string of XML that represents the tree
* @param {Function} (optional) A function, which when passed the node, returns true or false to include
* or exclude the node.
* @param {Function} (optional) A function, which when passed an attribute name, and an attribute value,
* returns true or false to include or exclude the attribute.
* @return {String}
*/

Ext.tree.TreePanel.prototype.toXmlString = function(nodeFilter, attributeFilter, attributeMapping){
  return '\u003C?xml version="1.0"?>\u003Ctree>' +
    this.getRootNode().toXmlString(nodeFilter, attributeFilter, attributeMapping) +
    '\u003C/tree>';
};

/**
* Returns a string of XML that represents the node
* @param {Function} (optional) A function, which when passed the node, returns true or false to include
* or exclude the node.
* @param {Function} (optional) A function, which when passed an attribute name, and an attribute value,
* returns true or false to include or exclude the attribute.
* @return {String}
*/

Ext.tree.TreeNode.prototype.toXmlString = function(nodeFilter, attributeFilter, attributeMapping){
//  Exclude nodes based on caller-supplied filtering function
        if (nodeFilter && (nodeFilter(this) == false)) {
                return '';
        }
        var result = '\u003Cnode';

//  Add the id attribute unless the attribute filter rejects it.
        if (!attributeFilter || attributeFilter("id", this.id)) {
                result += ' id="' + this.id + '"';
        }

//  Add all user-added attributes unless rejected by the attributeFilter.
        for(var key in this.attributes) {
                if ((key != 'id') && (!attributeFilter || attributeFilter(key, this.attributes[key]))) {
                 if (attributeMapping && attributeMapping[key]) {
        thisKey = attributeMapping[key];
      } else {
        thisKey = key;
      }
      result += ' ' + thisKey + '="' + this.attributes[key] + '"';
         }
        }

//  Add child nodes if any
        var children = this.childNodes;
        var clen = children.length;
        if(clen == 0){
                result += '/>';
        }else{
                result += '>';
                for(var i = 0; i < clen; i++){
                        result += children[i].toXmlString(nodeFilter, attributeFilter, attributeMapping);
                }
                result += '\u003C/node>';
        }
        return result;
};
 
应用
  function contextmenu(node, e) {
    node.select();
    if (node.isLeaf()) {
      var json = node.toJsonString(null, function(key, val) {
        return (key == 'loginfo');
      }, {
        loginfo : 'loginfo'
      });
      alert("步骤日志:" + json);
    }
  }