0

我正在拉下一个大型 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;
        }

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

空引用在哪里?

4

3 回答 3

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' 是文本节点并且没有节点名称。

要更正此问题,您可以将 namer 函数更新为以下内容:

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”作为树中相应节点的标签。

于 2009-02-05T18:01:28.223 回答
0

您是否尝试过在 flex builder 或 eclipse 中调试它?

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

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

编辑:您的 Tree 组件也有一个 dataProvider

dataProvider="{treeData}"

从您给出的示例中,它看起来不像 treeData 存在。那应该是fullXML吗?

于 2009-02-02T18:40:30.520 回答
0

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

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

尝试绘制叶节点时返回 nodeName.localName 失败。所以我知道它与以下内容有关:

return nodeName.localName;

public function treeChanged(event:Event):void {
selectedNode=Tree(event.target).selectedItem;
}
于 2009-02-02T19:05:27.507 回答