SimpleXML2TreeNode

写了一个简陋的小程序,将XML解析成AsWing的tree node,便于将XML文档在JTree组件中表现出来,之前一直想继承DefaultTreeModel来实现,不过感觉好像DefaultTreeModel中好多都是private(像根节点root,子类中不能调用的话又要自己实现一边会调用到root的方法),不能直接使用,但是如果仅实现TreeModel接口,又要把许多DefaultTreeModel中的方法重新写一遍,怎么都没想到更好的办法,就写了这个把XML解析成treeNode的简陋class,大家如果有好的建议请赐教啊 :smile:

下面是源代码

package cn.harryxu.aswingext.tree {
 
import org.aswing.tree.DefaultMutableTreeNode;
import org.aswing.tree.MutableTreeNode;
 
/**
 * Parse XML to AsWing tree node.
 *
 * @author harry
 */
public class SimpleXML2TreeNode {
 
	protected var _root:MutableTreeNode;
	protected var _xml:XML;
	protected var labelField:String;
 
	public var autoParse:Boolean;
 
	public function get root():MutableTreeNode {
		return _root;
	}
 
	public function set root(value:MutableTreeNode):void {
		_root = value;
		if(autoParse) parse();
	}
 
	public function set xml(value:XML):void {
		_xml = value;
		if(autoParse) parse();
	}
 
	public function get xml():XML {
		return _xml;
	}
 
	public function SimpleXML2TreeNode(xml:XML,
            root:MutableTreeNode=null,
            labelField:String="@label",
            autoParse:Boolean=false) {
 
		_xml = xml;
		this.labelField = labelField;
		this.autoParse = autoParse;
		this.root = root||new DefaultMutableTreeNode("root");
	}
 
	public function parse():void {
		removeAllRootChildern();
		parseXML(xml, _root);
	}
 
	public function removeAllRootChildern():void {
		var len:int = root.getChildCount()-1;
		for (var i:int = len; i >= 0; i--) {
			root.removeAt(i);
		}
	}
 
	protected function parseXML(xml:XML, node:MutableTreeNode):void{
		var subnode:DefaultMutableTreeNode =
				new DefaultMutableTreeNode(xml[labelField]);
		node.insert(subnode, node.getChildCount());
 
		var children:XMLList = xml.children();
		for each(var subxml:XML in children) {
			parseXML(subxml, subnode);
		}
	}
}
}

测试代码:
package tests
{
import cn.harryxu.aswingext.tree.SimpleXML2TreeNode;
 
import flash.events.Event;
 
import org.aswing.BorderLayout;
import org.aswing.JPanel;
import org.aswing.JScrollPane;
import org.aswing.JTree;
import org.aswing.tree.DefaultTreeModel;
 
public class XMLTreeNodeTest extends JPanel
{
	private var xml:XML =
 
		;
 
	public function XMLTreeNodeTest() {
		super(new BorderLayout());
		var xnp:SimpleXML2TreeNode = new SimpleXML2TreeNode(xml, null, "@name");
		xnp.parse();
 
		var tree:JTree = new JTree(new DefaultTreeModel(xnp.root));
		tree.setRootVisible(false);
 
		var sp:JScrollPane = new JScrollPane(tree);
		append(sp);
 
		addEventListener(Event.ADDED_TO_STAGE, __addToStage);
	}
 
	private function __addToStage(e:Event):void {
		setSizeWH(stage.stageWidth, stage.stageHeight);
		setVisible(true);
		revalidate();
	}
 
}
}
 
/*
you can use these code to run it
 
var test:Component;
 
test = new XMLTreeNodeTest();
addChild(test);
*/

http://harryzhxu.googlepages.com/SimpleXML2TreeNodeTest.swf

评论