2009-02-02 48 views
1

我拉下一个大的XML文件,我无法控制它的结构。Flex树属性,空引用?

我使用了一个自定义函数来使用标签名称来查看树形结构作为一个弹性树,但随后它会中断。我猜测它与我的其他功能有关,即从所选节点调用属性值的功能。

查看代码。

<mx:Tree x="254" y="21" width="498" height="579" id="xmllisttree"  labelFunction="namer" dataProvider="{treeData}" showRoot="false" change="treeChanged(event)" /> 

//and the Cdata

import mx.rpc.events.ResultEvent; 
[Bindable] private var fullXML:XMLList; 
private function contentHandler(evt:ResultEvent):void{ 
    fullXML = evt.result.page; 
} 

[Bindable] 
public var selectedNode:Object; 

public function treeChanged(event:Event):void { 
selectedNode=Tree(event.target).selectedItem; 
} 

public function namer(item:Object):String { 
     var node:XML = XML(item); 
     var nodeName:QName = node.name(); 
     var stringtest:String ="bunny"; 
      return nodeName.localName; 
     } 

该错误是类型错误:错误#1009:无法访问空对象引用的属性或方法。

空引用在哪里?

+0

您是否在使用FlexBuilder?如果你是,你有没有尝试在代码中设置断点? TypeError是否在堆栈跟踪中报告行号? – 2009-02-02 13:54:34

+0

我认为从您提供的代码中了解您的问题是相当困难的:namer永远不会被调用,也不会加载xml文件。如果您提供可以重现您的问题的代码示例,则更容易为您提供帮助。 – 2009-02-02 14:51:57

回答

1

确定。这听起来像你的XML看起来是这样的:

<root> 
    <test> 
    <child>leaf 1</child> 
    </test> 
    <test2> 
    <child2>leaf 2</child2> 
    </test2> 
</root> 

这样做的显著的部分是,有孩子和的child2标签内的简单内容。展开树显示“叶1”或“叶2”会导致您收到的错误,因为node.name()将返回null。这是有道理的,因为'叶1'和'叶2'是文本节点并且没有节点名称。

要解决这个问题,你可以更新命名器功能,这些方针的东西:

public function namer(item:Object):String { 
    var node:XML = XML(item); 
    var nodeName:QName = node.name(); 
    if (nodeName) { 
     return nodeName.localName; 
    } else { 
     return String(node); 
    } 
} 

这将使用“叶1”和“叶2”的标签,在树中相应的节点。

0

你有没有尝试在flex builder或eclipse中调试这个?

您的空引用错误的最可能的候选者是传递给namer()的'item'参数。树组件不会将字符串传递给labelFuntion方法,但它可能不是可以转换为xml对象的字符串。我肯定会先检查一下。

我能看到的另一件事是错误的是您正在访问localName,就好像它是一个属性。这实际上是方法,所以你应该通过nodeName.localName()来调用它。 编辑...这是不正确的,因为我没有意识到nodeName是QName类型。 localName实际上是这种类型的属性。 appologies

编辑:还你Tree组件具有

dataProvider="{treeData}" 

一个数据提供程序从你给它看起来并不像treeData存在的例子。应该是fullXML吗?

0

根据Flex和那位回答我的另一个问题(Herreman)将localname称为属性的人是正确的做事方式。

fullXML和stringtest行是工件。我将XML嵌入到同一个文件atm中。

当它试图绘制叶节点时,返回nodeName.localName失败。 所以我知道它是与:

return nodeName.localName; 

public function treeChanged(event:Event):void { 
selectedNode=Tree(event.target).selectedItem; 
}