2012-05-17 73 views
0

我試圖構建一個抽象方法,通過節點名稱獲取XML對象中的所有節點。我不提前知道XML的結構。所以用這個代碼按名稱獲取子節點的XMLList的抽象方法

我想獲得的所有「項目」節點和所有的「X」節點列表:

var xml:XML = <root><items><item/><item/><item><x/><item><item><x/></item></items></root> 
var nodeName:String; 
var list:XMLList; 


list = getNodeByName(xml, "item"); // contains no results 
list = getNodeByName(xml, "x"); // contains no results 

// what am i doing wrong here? 
public static function getNodeByName(xml:XML, nodeName:String):XMLList { 
    return xml.child(nodeName); 
} 
+0

你能否避免在編譯時通過的代碼?謝謝。 這避免浪費時間。 rbyte的答案應該可以幫助你。 – tatactic

+0

@ tatactic如果您懷疑它是錯誤的,請不要更改代碼:問題可能基於這種錯誤。如果您懷疑問題中存在拼寫錯誤,只需發表評論,並詢問在原始代碼中是否存在錯誤。 – Nanne

+0

我應該提到那是僞代碼。謝謝 –

回答

3

正如方法的名字說,child只會返回一個列表XML對象的子對象與給定參數匹配。如果你想獲得XML對象的所有後代(子女,孫子,曾孫等)使用相同的名字,你應該使用descendants方法:

public static function getNodeByName(xml:XML, nodeName:String):XMLList { 
    return xml.descendants(nodeName); 
} 

希望它能幫助。

+0

謝謝你是 –

1

您是否希望將所有來自不同父級的相同名稱的節點連接到一個XML結構中?在這種情況下,你可以做的是這樣的:

public static function getNodesByName(myXML_:XMLList, nodeName_:String) : XMLList { 
     var result:XMLList = new XMLList(); 
     for (var i1:Number = 0; i1 < myXML_.children().length(); i1++) { 
      if (myXML_.children()[i1].name() == nodeName_) { 
       result += myXML_.children()[i1].valueOf(); 
      } else if (myXML_.children()[i1].children()) { 
       result += getNodesByName(XMLList(myXML_.children()[i1].valueOf()), nodeName_); 
      } 
     } 
     return result; 
    } 

它會返回XMLList和所有具有指定名稱的節點。如果您想打開該列表轉換成XML然後

var nodesList:XMLList = getNodesByName(myXML.children(), "myNodeName").valueOf(); 

:使用這樣的

var myXMLListTurnedIntoXML:XML = XML("<xml></xml>"); 
myXMLListTurnedIntoXML.appendChild(getNodesByName(myXML.children(), "myNodeName").valueOf()); 

希望這將有助於。

+0

。感謝盧卡斯。 –