2009-02-02 50 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; 
}