写了一个简陋的小程序,将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
评论
啊,其实用AsWing的人还是挺多的啊,只不过高手们都比较
harry 发布
啊,其实用AsWing的人还是挺多的啊,只不过高手们都比较低调啊,不像我整天卖弄 :mrgreen:
楼主在吗
音乐歌词 发布
楼主在吗
?????????
harry 发布
?????????