我正在删除一个大型XML文件,我无法控制它的结构。
我使用自定义函数来使用标记名称将树结构视为弹性树,但随后它会中断。我猜它与我的其他函数有关,一个从所选节点调用属性值的函数。
见代码。
<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;
}
<mx:Tree x="254" y="21" width="498" height="579" id="xmllisttree" labelFunction="namer" dataProvider="{treeData}" showRoot="false" change="treeChanged(event)" />
错误是TypeError:错误#1009:无法访问空对象引用的属性或方法。
空引用在哪里?
答案 0 :(得分:1)
行。听起来你的XML看起来像这样:
<root>
<test>
<child>leaf 1</child>
</test>
<test2>
<child2>leaf 2</child2>
</test2>
</root>
这一点的重要部分是child和child2标签中有简单的内容。展开树以显示“叶1”或“叶2”会导致您收到错误,因为node.name()将返回null。这是有道理的,因为'leaf 1'和'leaf 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);
}
}
这将使用'leaf 1'和'leaf 2'作为树中相应节点的标签。
答案 1 :(得分:0)
您是否尝试过在flex builder或eclipse中调试它?
空引用错误的最可能的候选者是传递给namer()的'item'参数。树组件确实将字符串传递给labelFuntion方法,但它可能不是可以转换为xml对象的字符串。我肯定会先检查一下。
我能看到的另一件事是错误的是你正在访问localName,就好像它是一个属性一样。它实际上是方法,所以你应该通过nodeName.localName()来调用它。 编辑...这是不正确的,因为我没有意识到nodeName是QName类型。 localName实际上是此类型的属性。 appologies 强>
编辑:您的Tree组件也有一个
的dataProviderdataProvider="{treeData}"
从您给出的示例看起来不像treeData存在。应该是fullXML吗?
答案 2 :(得分:0)
根据Flex和回答我的另一个问题的人(Herreman)称localname为财产是正确的做事方式。
fullXML和stringtest行是工件。我将XML嵌入到同一个文件atm中。
尝试绘制叶节点时,返回nodeName.localName失败。 所以我知道这与它有关:
return nodeName.localName;
和
public function treeChanged(event:Event):void {
selectedNode=Tree(event.target).selectedItem;
}